반응형
https://www.acmicpc.net/problem/11055
dp문제였습니다.
📕 풀이방법
📔 입력 및 초기화
배열길이 n과 배열을 arr를 선언 후 입력받습니다.
📔 풀이과정
완전 탐색으로 i까지 도달했을 때 가장 큰 증가 부분 수열의 값을 d[i]라 하면 다음과 같은 점화식이 가능합니다.
$${ if \ arr[i] > arr[j] \ D[i] = MAX(D[j](0<=j<i) + A[i]) }$$
arr[i]가 가장 큰 값이므로 그보다 작은 arr[j]를 발견할 경우 그때의 D[j]값에서 현재 선택 값인 arr[i]를 더한 값의 최댓값을 d[i]에 저장하면 됩니다.
n이 1000까지이므로 O(N^2)로 동작 가능한 풀이입니다.
📔 정답 출력 | 반환
정답 배열의 가장 큰 원소를 반환합니다.
📕 Code
📔 C++
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> arr(n);
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
vector<int> dp(n);
for (int i = 0; i < n; i++) {
dp[i] = arr[i];
for (int j = 0; j < i; j++) {
if (arr[j] < arr[i]) {
dp[i] = max(dp[i], dp[j] + arr[i]);
}
}
}
int ans = *max_element(dp.begin(), dp.end());
cout << ans << '\n';
}
📔 Python3
import sys
input = sys.stdin.readline
n = int(input())
arr = list(map(int, input().split()))
dp = [0] * n
dp[0] = arr[0]
for i in range(1,n):
dp[i] = arr[i]
for j in range(i):
if arr[i] > arr[j]:
dp[i] = max(dp[i], dp[j] + arr[i])
print(max(dp))
*더 나은 내용을 위한 지적, 조언은 언제나 환영합니다.
'Algorithm > DP(Dynamic Programing)' 카테고리의 다른 글
(C++) - 백준(BOJ) 11051번 : 이항 계수2 (0) | 2017.02.05 |
---|---|
(C++) - 백준(BOJ)코딩 2579번 : 계단오르기 답 (0) | 2017.01.29 |
(C++) - 백준(BOJ) 13699번 : 점화식 (0) | 2016.11.15 |
(C++) - 백준(BOJ) 9657번 : 돌 게임 3 답 (0) | 2016.11.05 |
(C++) - 백준(BOJ) 2748번 : 피보나치 수 2 (0) | 2016.09.23 |