DP를 이용해서 해결하는 문제였다. "최장 수열"과는 다르게 연속된 합이기 때문에 매 분기마다 모든 이전 입력값을 확인할 필요는 없어서 1중 FOR문으로 점화식을 세웠다.
그런데 한가지 문제점이 있었다. 처음 입력값이 음수로 들어오고 그 뒤로도 음수가 들어온다면 초기 RESULT 설정값을 0으로 하거나 하지 않으면 max 함수에서 0이 최대값으로 저장돼 답이 0으로 출력되었다. 이 점을 해결하는 아이디어가 떠올려지지 않아 정답을 찾아보았는데 해결법은 간단했다.
dp초기 값과 result를 동기적으로 입력 list[0]값으로 설정해주면 모든 문제가 해결되었다.
dp[0] = list[0]; result = list[0];
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#define endl "\n"
using namespace std;
int n;
int list[100001];
int dp[100002];
int result;
void input() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> list[i];
}
}
void dynamic() {
dp[0] = list[0];
result = list[0];
for (int i = 1; i < n; i++) {
dp[i] = max(dp[i - 1] + list[i], list[i]);
result = max(dp[i], result);
}
cout << result << endl;
}
int main() {
input();
dynamic();
return 0;
}