백준이당

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

이히당 2025. 5. 21. 10:53

https://www.acmicpc.net/problem/1912

문제

수열이 있을 때, 부분 수열의 합의 최댓값을 구하기

  • 점화식
1.  a[i] = max(a[i-1] + a[i], a[i])
2.  max_val = max(a[i], max_val)

 

첫번째 식은, (1) 이전 값들을 반영한 값과 (2) 반영하지 않은 값을 비교해서 더 큰 값을 저장하도록 하기 위함이다.

 

두번째 식은, (1) 현재 차례에서 반영된 값과, (2) 전역 최댓값을 비교해서 더 큰 값으로 갱신하기 위함이다.

 

처음에는 스택으로 푸는 건가,, LIS(최장 증가 수열)의 응용인가..

싶었는데,, 그냥 DP다.. 점화식을 잘 찾아보자..

 

 

풀이

#include <bits/stdc++.h>
using namespace std;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    int n;
    cin >> n;

    vector<int> nums(n);
    for (int i = 0; i < n; i++)
    {
        cin >> nums[i];
    }

    int max_val = nums[0];

    for (int i = 1; i < n; i++)
    {
        nums[i] = max(nums[i - 1] + nums[i], nums[i]);
        max_val = max(max_val, nums[i]);
    }
    cout << max_val;
}
728x90