룰루랄라 코딩기록장
[Baekjoon] 백준 1912번 연속합 본문
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라는 수가 나오게 된다.
'Algorithm > 다이나믹프로그래밍' 카테고리의 다른 글
[Baekjoon] 백준 1699 제곱수의 합 (0) | 2019.06.07 |
---|---|
[Baekjoon] 백준 13398 연속합2 (0) | 2019.06.07 |
[Baekjoon] 백준 11054번 가장 긴 바이토닉 부분수열 (0) | 2019.06.05 |
[Baekjoon] 백준 11722번 가장 긴 감소하는 부분수열 (0) | 2019.06.05 |
[Baekjoon] 백준 11055번 가장 큰 증가하는 부분수열 (0) | 2019.06.05 |
Comments