AcWing 1016. 最大上升子序列和(線性DP)
阿新 • • 發佈:2022-04-13
題目描述
一個數的序列 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; }