ECNU2958最大上升子序列(动态规划)

View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 int a[5005];
 4 int sum[5005];//用来记录以a[i]结尾之前的最大上升子序列
 5 int main()
 6 {
 7     int i,j,num=-1,tpmax,t,n,max;
 8     scanf("%d",&t);
 9     while(t--)
10     {
11         num++;
12         scanf("%d",&n);
13         for(i=1;i<=n;i++)
14             scanf("%d",&a[i]);
15         //memset(sum,0,sizeof(sum));
16         sum[1]=a[1];
17         for(i=2;i<=n;i++)
18         {
19             tpmax=0;
20             for(j=1;j<i;j++)
21             {
22                 if(a[i]>a[j]&&(tpmax<sum[j]))/*//a[i]>a[j]用来判断前者比后者大;tpmax<sum[j]是用来判断能否把a[j]加入tpmax中,换句话说tpmax也代表了sum[j-1];*/
23                     tpmax=sum[j];
24             }
25             sum[i]=tpmax+a[i];
26         }
27         max=sum[1];
28         for(i=1;i<=n;i++)
29             if(max<sum[i])
30                 max=sum[i];
31         printf("case #%d:\n",num);
32         printf("%d\n",max);
33     }
34     return 0;
35 }
keep moving...
原文地址:https://www.cnblogs.com/xxx0624/p/2475832.html