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\n",len);
34 }
35 return 0;
36 }