问题:
给出n列数,求出每列数的最大升序子序列和(可跳过多个数字),每列第一个数代表本列有几个数。输入0时结束。
simple input:
simple output:3 1 3 2 4 1 2 3 4 4 3 3 2 1 0
4
10
3
分析:
套用最长上升子序列的的模板。求前i(1-n)个数的最大上升子序列和,穷举出所有的最大和后,选出其中最大的。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int a[10001],dp[10001];
int main(){
//freopen("s.txt","r",stdin);
int n,i,j,t;
while(cin>>n&&n!=0){
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=n;i++){
t=-9999;
for(j=0;j<=i;j++){
if(a[j]<a[i]){
t=max(t,dp[j]);
}
}
dp[i]=t+a[i];
}
t=-9999;
for(i=1;i<=n;i++){
if(dp[i]>t)
t=dp[i];
}
cout<<t<<endl;
}
return 0;
}