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 }

你可能感兴趣的:(动态规划)