1. 程式人生 > 其它 >AcWing 1016. 最大上升子序列和(線性DP)

AcWing 1016. 最大上升子序列和(線性DP)

題目連結


題目描述

一個數的序列 bi,當 b1<b2<…<bS 的時候,我們稱這個序列是上升的。
對於給定的一個序列(a1,a2,…,aN),我們可以得到一些上升的子序列(ai1,ai2,…,aiK),這裡1≤i1<i2<…<iK≤N。
比如,對於序列(1,7,3,5,9,4,8),有它的一些上升子序列,如(1,7),(3,4,8)等等。
這些子序列中和最大為18,為子序列(1,3,5,9)的和。
你的任務,就是對於給定的序列,求出最大上升子序列和。
注意,最長的上升子序列的和不一定是最大的,比如序列(100,1,2,3)的最大上升子序列和為100,而最長上升子序列為(1,2,3)。

題目模型

  • 最長上升子序列

題目程式碼

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1010;

int n;
int w[N];
int f[N];

int main()
{
    scanf("%d", &n);
    for(int i = 0; i < n; i ++ ) scanf("%d", &w[i]);
    
    int res = 0;
    for(int i = 0; i < n; i ++ )
    {
        f[i] = w[i];
        for(int j = 0; j < i; j ++ )
            if(w[i] > w[j])
                f[i] = max(f[i], f[j] + w[i]);
                
        res = max(res, f[i]);
    }
    
    printf("%d\n", res);
    
    return 0;
}