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

 

11055번: 가장 큰 증가 부분 수열

수열 A가 주어졌을 때, 그 수열의 증가 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가 부분 수�

www.acmicpc.net

더보기
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    struct node {
        int index, sum;
    };
    vector<int> arr;
    int n;
    vector<node> dp;
    cin >> n;
    arr.resize(n + 1);
    dp.resize(n + 1);  
    for (int i = 1; i <= n; i++) {
        cin >> arr[i];
        dp[i] = { 1, arr[i] };
    }
    //dp[i] = i번째 까지의 증가수열중 마지막 값.
    
    
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= i - 1; j++) {
            if (arr[i] > arr[j]) {
                if (dp[i].sum < dp[j].sum + arr[i]) {
                    dp[i].sum = dp[j].sum + arr[i];
                }
            }           
        }
    }
    int mx = 0;
    for (int i = 1; i <= n; i++) {
        if (mx < dp[i].sum) {
            mx = dp[i].sum;
        }
    }
    cout << mx << endl;
    return 0;
}