题意:给定一串数字,要求选取一个严格递增的子序列,使序列和最大。
dp[i] 表示以 i 为结尾的子序列的最大和,dp[i] = max{dp[j]+a[i]}(j 从 0 到 i-1),dp[0]是0;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h>
2 #include<string.h>
3 #define max(a,b) a>b?a:b
4
5 int a[1002];
6 long long dp[1002];
7
8 int main(){
9 int n;
10 while(scanf("%d",&n)!=EOF&&n!=0){
11 int q,i,j;
12 long long m=0;
13 for(q=1;q<=n;q++){
14 scanf("%d",&a[q]);
15 dp[q]=a[q];
16 for(i=1;i<q;i++){
17 if(a[i]<a[q]){
18 dp[q]=max(dp[q],dp[i]+a[q]);
19 }
20 }
21 m=max(m,dp[q]);
22 }
23 printf("%I64d\n",m);
24 }
25 return 0;
26 }