다이나믹 프로그래밍 연습문제.
어렵다.
생각해내기가 어렵다.
머리를 싸매고 여며봤는데 생각이 안나 결국 해결방법을 찾아보았다.
방법은 이러하다.
입력된 배열 말고 다른 배열을 하나 만든다 (D 배열이라 가정)
D배열엔 그 인덱스까지 더한 최대값을 적어놓는다.
예)
그리고 D 배열에 들어있는 성분 중 가장 큰 수를 출력한다.
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #include <stdio.h> #include<iostream> #include <algorithm> using namespace std; int arr[100001]; int d[100001]; int main() { int n; cin >> n; for (int i = 0; i < n; i++) { cin >> arr[i]; } d[0] = arr[0]; for (int i = 1; i < n; i++) { if (d[i - 1] + arr[i] > arr[i]) { d[i] = d[i - 1] + arr[i]; } if (d[i - 1] + arr[i] <= arr[i]) { d[i] = arr[i]; } } int ans = -2000000000; for (int i = 0; i < n; i++) { ans = max(ans, d[i]); } cout << ans; } | cs |
머리 아프다. 저녁먹으러 가야지
'BOJ' 카테고리의 다른 글
백준 2225 / 합분해 (0) | 2018.12.29 |
---|---|
백준 1699 / 제곱수의 합 (0) | 2018.12.29 |
백준 14002 / 가장 긴 증가하는 부분 수열 4 (0) | 2018.12.27 |
백준 11053 / 가장 긴 증가하는 부분 수열 (0) | 2018.12.26 |
백준 15990 / 1,2,3 더하기 5 (0) | 2018.12.26 |