룰루랄라 코딩기록장

[Baekjoon] 백준 1912번 연속합 본문

Algorithm/다이나믹프로그래밍

[Baekjoon] 백준 1912번 연속합

Jeonnnng 2019. 6. 5. 18:56

1912번 연속합 문제 풀이

문제

  • n개의 정수로 이루어진 임의의 수열이 주어진다. 우리는 이 중 연속된 몇 개의 수를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하려고 한다. 단, 수는 한 개 이상 선택해야 한다.
    예를 들어서 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 이라는 수열이 주어졌다고 하자. 여기서 정답은 12+21인 33이 정답이 된다.

입력

  • 첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.

출력

  • 첫째 줄에 답을 출력한다.

예제

입력
10
10 -4 3 1 5 6 -35 12 21 -1
출력
33

코드

#include<iostream>
#include<algorithm>
using namespace std;

int d[100001];
int a[100001];

int main() {
    int n; 
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    d[0] = 0;
    for (int i = 1; i <= n; i++) {
        d[i] = max(d[i - 1] + a[i], a[i]);
    }

    int ans = -100000;
    for (int i = 1; i <= n; i++) {
        if (ans < d[i])
            ans = d[i];
    }
    cout << ans << '\n';
    return 0;
}

해결방법

  • d[i]는 i번째 수로 끝나는 가장 큰 연속합을 저장한다. 따라서 i번째를 더해서 가장 큰 연속합은 d[i-1] + a[i]가 된다.
  • 이 때 이전 연속합에 a[i]를 포함시켜서 수를 만드는 방법도 있지만, a[i]부터 연속합을 시작하는 경우도 고려해야한다.
  • d[i-1] + a[i] < a[i]일 때 d[i] = d[i-1]+a[i]가 되버리면 a[i]로 시작하는 것 보다 수가 작아질 수 밖에 없다.
  • ex > {6,7,-14,11,3}수열이 존재할 때 i = 3인 경우를 생각하면 d[i-1]+a[i] = -1 + 11 = 10이 되버려서 최종적으로 13이라는 수가 나오게 된다. 하지만 d[i]=a[i]인 경우 마지막에 11+3이 되기 때문에 13보다 큰 14라는 수가 나오게 된다.
Comments