1 /*解题思路请看给分类的最长递增子序列算法解析那篇文章*/ 2 #include<stdio.h> 3 #include<string.h> 4 int find(int *c,int len,int n) 5 { 6 int l=0,r=len; 7 while(l<=r) 8 { 9 int mid=(l+r)/2; 10 if(c[mid]<n) l=mid+1; 11 else if(c[mid]>n) r=mid-1; 12 else return mid; 13 } 14 return l; 15 } 16 int main() 17 { 18 int i,j,n; 19 int a[1005], c[1005],len; 20 while(scanf("%d",&n)!=EOF) 21 { 22 for(i=0;i<n;i++) 23 scanf("%d",&a[i]); 24 c[0]=-1; 25 c[1]=a[0]; 26 len=1;//此时只有c[1]求出来,最长递增子序列的长度为1. 27 for(i=1;i<n;i++) 28 { 29 j=find(c,len,a[i]); 30 c[j]=a[i]; 31 if(j>len) len=j; 32 } 33 printf("%d ",len); 34 } 35 return 0; 36 }