< [C++ / 백준 1912번] 연속합

프로그래밍 공부/백준 (C++)

[C++ / 백준 1912번] 연속합

Rocketbabydolls 2024. 11. 22. 13:48

 

 

DP를 이용하여 풀이했다. 범위가 100,000 이고 시간 제한이 1초이므로 이중 for문을 사용할 수 없다.

따라서 카데인 알고리즘을 활용해 풀이했다.

배열 하나씩 더해가면서 DP 배열을 구하되  ans 변수를 이용해 최대 값이 나온 dp 배열 인덱스의 값을 동시에 찾도록 했다.

그리고 0번째 인덱스 값 혼자가 최대값일 때를 대비해 for문에 들어가지 않는 0번 인덱스를 ans 와 다시 한번 비교해 주었다.

 

주의할 점은 dp 배열은 (해당 인덱스 - 1 ) + a[해당 인덱스] 값과 a[해당 인덱스] 값 중 누가 큰지를 저장하는 역할이고(0부터 해당 인덱스까지의 원소를 합했을 때의 최대 값) , 실제 답은 ans 에 저장된다는 것이다.

 

 

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;


int main() {
    vector<int> a, dp;


    int N;
    cin >> N;

    for (int i = 0; i < N; i++)
    {
        int input;

        cin >> input;

        a.push_back(input);

    }

    dp.assign(N, 0);
    int ans = -989898;

    int tmp = 0;
    


    dp[0] = a[0];
    for (int i = 1; i < N; i++)
    {
        dp[i] = max(a[i], dp[i-1] + a[i]);

        ans = max(ans, dp[i]);
    }

    ans = max(ans, dp[0]);

    cout << ans;






    return 0;
}