프로그래밍/알고리즘 PS
[C++] BOJ 1912번: 연속합
코딩 제이티
2020. 12. 1. 09:44
문제 풀이
해당 문제를 DP(Dynamic Programming) 알고리즘을 이용하여 해결할 수 있다.
dp[i] = dp[i-1] + arr[i], 단 (dp[i-1] + arr[i]) < 0일 경우 dp[i] = 0.
위의 식은 i = 0... n-1에 대하여 arr[i] < 0일 경우엔 성립되지 않음에 주의하자.
코드
#include <bits/stdc++.h>
using namespace std;
int arr[100006];
int n;
int result;
int dp[100006]; // 연속된 수열의 합 중 n번째까지 가장 큰 합
void calcDp()
{
bool allMinus = true;
dp[0] = arr[0];
result = -9999;
for (int i = 0; i < n; i++)
{
if (arr[i] > result)
result = arr[i];
if (arr[i] > 0)
allMinus = false;
}
if (allMinus)
return;
for (int i = 1; i < n; i++)
{
dp[i] = dp[i - 1] + arr[i];
if (dp[i] < 0)
dp[i] = 0;
if (result < dp[i])
result = dp[i];
}
}
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 0; i < n; i++)
cin >> arr[i];
calcDp();
cout << result << '\n';
return 0;
}