您的位置:首页 > 其它

最长递增子序列(时间复杂度n*logn)

2013-03-26 15:18 141 查看
利用二分的思想将时间复杂度降到了n*logn,很好~

代码实现:

#include<stdio.h>//时间复杂度为(n*logn)
#include<string.h>
int a[5001],dp[5001];
int main()
{
int i,n,len,m,r,p;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
scanf("%d",&a[i]);
dp[0]=-1000000;
dp[1]=a[0];
len=1;
for(i=1;i<n;i++)
{
p=0;r=len;
while(p<=r)//二分查找
{
m=(p+r)/2;
if(a[i]>dp[m])
p=m+1;
else
r=m-1;
}
dp[p]=a[i];
if(p>len)//长度增加了1
len++;
}
printf("%d\n",len);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: