#include<stdio.h>
#include<string.h>
const int maxn=100001;
int dp[maxn],a[maxn];
int Binary_search(int len,int k)
{
// 查找比第一个比dp[i]小或者是相等的位置
int start,end,mid;
start=1;
end=len;
while(start<=end)
{
mid=(start+end)>>1;
if(k==dp[mid])
return mid;
if(k>dp[mid])
start=mid+1;
else
end=mid-1;
}
return start;
}
int main()
{
int n,i,t,len;
while(scanf("%d",&n)!=EOF)
{
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++)
scanf("%d",&a[i]);
len=1;
dp[1]=a[0];
for(i=1;i<n;i++)
{
t=Binary_search(len,a[i]);// 通过二分搜索查找要插入的位置
dp[t]=a[i]; // 更新dp的值
if(t>len) //如果插入的位置在最后,更新最大的长度
len=t;
}
printf("%d\n",len);
}
}
原文:http://www.cnblogs.com/mycapple-zgs-111411/p/4617360.html