1. 程式人生 > >最大上升子序列和

最大上升子序列和

最大的 pre sub 個數 i++ show 鏈接 ans 一個

最大上升子序列和

鏈接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1285


時間限制: 1000 ms 內存限制: 65536 KB

【題目描述】

一個數的序列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)。

【輸入】

輸入的第一行是序列的長度N(1<=N<=1000)。第二行給出序列中的N個整數,這些整數的取值範圍都在0到10000(可能重復)。

【輸出】

最大上升子序列和。

【輸入樣例】

7
1 7 3 5 9 4 8

【輸出樣例】

18
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int f[1005],h[1005]; int main(){ int n,ans=0; cin>>n; for(int i=1;i<=n;i++){ cin>>h[i]; f[i]=h[i]; } for(int i=n;i>=1;i--) for(int j=n;j>i;j--) if(h[i]<h[j]) f[i]=max(f[i],h[i]+f[j]); for(int i=1;i<=n;i++) ans
=max(ans,f[i]); cout<<ans<<endl; }

最大上升子序列和