다이나믹 프로그래밍
[백준/C++][연속합 2(13398번)]
산기대 컴공
2020. 12. 20. 23:38
728x90
문제
https://www.acmicpc.net/problem/13398
13398번: 연속합 2
첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
www.acmicpc.net
문제 해결
기존의 연속합 문제에서 변형을 하였다.
기존의 연속합 문제 + 제거할 경우를 생각 했다.
제거 dp를 따로 만들어서 저장했고 dp의 값은 전 값을 제거한 값,그냥 전의 dp값을 받는 경우 2가지를 생각해서 두 값의 max값을 넣어 주었다.
코드
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 | #include <iostream> #include <algorithm> using namespace std; int main(void){ long long N,ary[100002],dp[100002][2] = {0,}; long long Max; cin >> N; for(int i = 1;i<=N;i++){ cin >> ary[i]; } dp[1][0] = ary[1]; dp[1][1] = ary[1]; Max = ary[1]; for(int i = 2;i<=N;i++){ if(ary[i]>=dp[i-1][0]+ary[i]){ dp[i][0] = ary[i]; Max = max(dp[i][0],Max); } else{ dp[i][0] = dp[i-1][0]+ary[i]; Max = max(dp[i][0],Max); } dp[i][1] = max(dp[i-1][1]+ary[i],dp[i-2][0]+ary[i]); Max = max(dp[i][1],Max); } cout << Max; } | cs |
728x90