ECNU2958最大上升子序列(动态规划)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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...