poj2533

 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 }
原文地址:https://www.cnblogs.com/okboy/p/3224030.html