March 14, 2021 ( last updated : March 14, 2021 )
dp
알고리즘
algorithm
https://github.com/sneakstarberry/
[백준] 1912번 연속합
dp문제 중 하나입니다. 따라서 브루트포스 방식으로도 문제를 풀 수 있지만 제한 시간이 있기 때문에 그럴 수 없습니다. 그렇다면 최적화를 진행해야합니다.
해당 예시를 살펴 보겠습니다. 1, 2, 3, -3, 4
1부터 3까지 더하면 6입니다. 하지만 해당 값은 최대 값이 아닙니다. 뒤에 음수가 있어도 이후 4까지 더하면 7이 나오기 때문입니다.
해당 값을 구하는 공식을 만들어 보겠습니다.
dp[n] = dp[n] + dp[n-1]
해당 값(dp[n]
)의 연속합을 구하기 위해서는 계속해서 이전 값과 현재 값을 더한 값이 현재 값이 되어야합니다. 하지만 이로서는 연속합만 될 뿐 최대 값이 될 수는 없습니다.
따라서 최대 값이 되도록 하기 위해서는 조건을 추가해야하는데 2가지를 생각하면 됩니다.
- 이전의 합이 음수라면 선택할 필요없이 현재부터 다시 선택하면 됩니다..
- 이전의 합과 현재의 수를 더한 값이 음수라면 선택할 필요가 없습니다..
위의 두가지 규칙을 염두해 두고 구한 점화식을 이용해서 구현하면 다음과 같은 코드가 됩니다.
#include <iostream>
#include <vector>
using namespace std;
int N, dp[100001];
int main() {
cin >> N;
int max;
for (int i = 1; i <= N; i++) {
cin >> dp[i];
}
max = dp[1];
for (int i = 2; i <= N; i++) {
if (dp[i - 1] > 0 && dp[i] + dp[i - 1] > 0) {
dp[i] += dp[i - 1];
}
if (max < dp[i]) {
max = dp[i];
}
}
cout << max;
return 0;
}
Originally published March 14, 2021
Latest update March 14, 2021
Related posts :