http://bailian.openjudge.cn/practice/2757/

#include<stdlib.h>
 #include<string.h>
 #include<math.h>
 #include<iostream>
 #include<algorithm>
 using namespace std;


 const int sizen=10000;
 struct ele
 {
     int value;
     int num;
 }p[sizen];


 int main()
 {
     int n;
     int i,j;
     int Max;
     while(scanf("%d",&n)!=EOF)
     {
         Max=0;
         memset(p,0,sizeof(p));
         for(i=0;i<n;i++)
             scanf("%d",&p[i].value);
         for(i=0;i<=n;i++)
         {
             for(j=0;j<i;j++)
                 if(p[i].value>p[j].value)
                     p[i].num=max(p[j].num+1,p[i].num);
             Max=max(Max,p[i].num);
         }


         printf("%d\n",Max+1);
     }
     return 0;
 }


 #include<stdio.h>
 #include<stdlib.h>
 #include<string.h>
 #include<math.h>
 #include<iostream>
 #include<algorithm>
 using namespace std;


 const int sizen=10000;
 int a[sizen],b[sizen];


 int main()
 {
     int n;
     int i;
     int t;
     int lat;
     while(scanf("%d",&n)!=EOF)
     {
         t=0;
         for(i=0;i<n;i++)
             scanf("%d",&a[i]);
         for(i=0;i<n;i++)
         {
             lat=lower_bound(b,b+t,a[i])-b;
             b[lat]=a[i];
             if(t==lat)
                 t++;
         }
         printf("%d\n",t);
     }
     return 0;
 }最后一个是贪心算法,效率为nlogn