백준 [1912] "연속합"

Kimbab1004·2024년 7월 16일
0

Algorithm

목록 보기
50/102

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;
}

0개의 댓글