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