最长上升子序列POJ2533
http://poj.org/problem?id=2533
注意dp[i]是以第i个数为尾数(一定为尾数结尾)的最长上升子序列。
dp[i]=max(dp[j]+1,dp[i])。
dp[n]不一定为最大的,所以要重新扫一遍。从零开始,所以最后要加一。
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 using namespace std; 5 int dp[1005],a[1005]; 6 main() 7 { 8 int n,i,j,ans=0; 9 scanf("%d",&n); 10 for(i=0;i<n;i++) 11 { 12 scanf("%d",&a[i]); 13 } 14 memset(dp,0,sizeof(dp)); 15 for(i=0;i<n;i++) 16 { 17 for(j=0;j<i;j++) 18 { 19 if(a[i]>a[j]) 20 dp[i]=max(dp[j]+1,dp[i]); 21 } 22 } 23 for(i=0;i<n;i++) 24 { 25 if(ans<dp[i]) 26 ans=dp[i]; 27 } 28 printf("%d",ans+1); 29 }