您的位置:首页 > 其它

LIS最长上升子序列

2016-05-03 11:54 375 查看
nlgn算法

//dp500-3
#include <cstdio>
#include <algorithm>
const int SIZE=1e5+10;
const int maxn=1<<30;
using namespace std;
int a[SIZE],dp[SIZE];
int Bin(int key,int n,int X[]){
int l=0,r=n;
while(l<=r){
int m=(l+r)>>1;
if(dp[m]>key)r=m-1;
else l=m+1;
}
return l;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
dp[i]=maxn;
}
int ans=0;
for(int i=0;i<n;i++){
int pos=Bin(a[i],n,dp);
printf("%d\n",pos);
if(pos==ans)dp[ans++]=a[i];
else dp[pos]=a[i];
}
printf("%d\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: