[BOJ] 13398 연속합 2
2018. 9. 12. 15:24
1. 문제링크
https://www.acmicpc.net/problem/13398
2. 해설
이 문제는 연속합 1과는 다르게 차원을 하나 더 설정해서 풀어줘야 한다.
내가 지금까지 더한 값이 하나를 빼고 더한 것인가 아니면 빼지 않은 채로 더한 것인가를 따로 저장하면서 다녀야한다.
1. 처음 초기화를 한다.
2. dp[0]은 빼지 않고 더한 값, dp[1]은 빼고 더한 값들 중 최적을 저장하고 다닌다.
3. dp 배열 안에 가장 큰 값을 출력한다.
3. 소스코드
#include<iostream> #include<algorithm> #define MAXNUM 100100 using namespace std; int arr[MAXNUM]={0}; int dp[2][MAXNUM]={0}; int main() { int n, ans= -1010; scanf("%d", &n); for (int i=0; i<n; i++) { scanf("%d", &arr[i]); } dp[0][0] = arr[0]; dp[0][1] = (arr[0] + arr[1] > 0) ? arr[0] + arr[1] : max(arr[0], arr[1]); dp[1][1] = arr[1]; ans = max({dp[0][0], dp[0][1], dp[1][1]}); for (int i=2; i<n; i++) { dp[0][i] = max(0, dp[0][i-1]) + arr[i]; dp[1][i] = max(dp[0][i-2], dp[1][i-1]) + arr[i]; ans = max({ans, dp[0][i], dp[1][i]}); } printf("%d\n", ans); return 0; }
4. 추가언급
전부 다 음수일 때가 문제가 될 수 있다. 이 경우를 방지하기 위해서 음수가 되면 앞의 값과 현재 num[i]의 값중에서 더 큰 값을 출력해준다. 그렇게 하면 전부 다 음수일 때는 num 배열중에 가장 큰 값을 찾아낼 수 있다.
'프로그래밍 > 문제풀이(boj)' 카테고리의 다른 글
[BOJ] 1005 ACM Craft (0) | 2018.10.11 |
---|---|
[BOJ] 2229 조짜기 (0) | 2018.09.12 |
[BOJ] 10845 큐 (0) | 2018.09.11 |
[BOJ] 1697 숨바꼭질 (0) | 2018.09.11 |
[BOJ] 2096 내려가기 (0) | 2018.09.07 |