Problem Solving/BOJ

백준 4097번 수익 - C++ 풀이

어멘드 2023. 7. 17. 22:55
반응형

 

1. dp[i] = i일로 끝나는 구간 중 최고수익 구간의 수익
2. dp[i] = i-1일로 끝나는 최고수익 구간에 i일을 추가하거나 i일로 구간을 새로 시작하는 경우 중 최댓값

 

1. dp[i] = i일로 끝나는 구간 중 최고수익 구간의 수익

 dp[i]를 위와 같이 정의하자. 예를 들어, dp[3]은 1-3일인 구간, 2-3일인 구간, 3-3일인 구간 중 최고 수익인 구간의 수익이다.

 

2. dp[i] = i-1일로 끝나는 최고수익 구간에 i일을 추가하거나 i일로 구간을 새로 시작하는 경우 중 최댓값

 구간은 연속된 일자로 이루어져 있다는 성질을 이용한다. i일로 끝나는 구간은 1. i-1로 끝나는 구간에 i일을 추가하거나, 2. i일로 시작하면서 끝나는 구간(i일로만 이루어진) 둘 중 하나이다. 이 두 구간 중 최댓값을 선택하면 된다.

 


#include <iostream>
#include <vector>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    while (1) {
        int N;
        cin >> N;
        if (N == 0) break;
        
        vector<int> profits(N+1, 0);
        for (int i=1; i<=N; i++) cin >> profits[i];
        
        // dp[i]: i일로 끝나는 구간 중 최고수익 구간의 수익
        vector<int> dp(N+1);
        int max_profit = -(1e5+1);
        for (int i=1; i<=N; i++) {
            // (i-1)일로 끝나는 구간에 i일을 더하기 or i일로 구간 새로 시작
            dp[i] = max(dp[i-1] + profits[i], profits[i]);
            max_profit = max(max_profit, dp[i]);
        }
        
        cout << max_profit << "\n";
    }
}

 

반응형