728x90
시간 제한 : 1초
메모리 제한 : 256MB
입력
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.
둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)
출력
첫째 줄에 수열 A의 합이 가장 큰 증가 부분 수열의 합을 출력한다.
소스코드
#include <iostream> using namespace std; int main(void) { int max, n, arr[1001] = { 0, }, dp[1001] = { 0, }; cin >> n; for (int i = 1; i <= n; i++) { cin >> arr[i]; dp[i] = arr[i]; } for (int i = 1; i <= n; i++) for (int j = 1; j < i; j++) if (arr[j] < arr[i]) dp[i] = dp[i] < (dp[j] + arr[i]) ? (dp[j] + arr[i]) : dp[i]; max = -1; for (int i = 1; i <= n; i++) if (max < dp[i]) max = dp[i]; cout << max; }
Tip
DP로 풀면 되고 아주 간단한 1차원적인 점화식이기 때문에 길게 고민할 필요가 없다.
dp[i] = dp[i] < (dp[j] + arr[i]) ? (dp[j] + arr[i]) : dp[i];
유사한 문제로 백준에서 가장 긴 증가하는 수열(11053), 가장 긴 감소하는 수열(11722) 등이 있다.
728x90
'Computer Science > Algorithm Problem' 카테고리의 다른 글
백준] 1920 - 수 찾기 (0) | 2017.12.11 |
---|---|
백준] 2864 - 5와 6의 차이 (0) | 2017.12.09 |
백준 알고리즘] 4948 - 베르트랑 공준(ACM-ICPC 2011) (0) | 2017.11.30 |
백준 알고리즘] 2399 - 거리의 차이 (0) | 2017.11.29 |
백준 알고리즘] 1159 - 농구 경기(COCI 2013/2014) (0) | 2017.11.28 |