您的位置:首页 > 其它

二分求最长上升子序列

2017-02-09 20:52 274 查看

简述

我们知道N2求最长上升子序列的方法,即

f[i]=max(f[i],f[j]+1)(j=1 i−1,f[i]>f[j])

然而,我们可以用二分求最长上升子序列。

由于我们知道子序列c,c[1]<c[2]<… <c


所以我们二分出一个位置t,将c[t]的值更新为a[i]。

如果t>ans,证明最长上升子序列的长度可以+1,于是ans++。

代码

#include<iostream>
#include<cstdio>
#include<cmath>
#define N 100010
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
int i,j,l,n,m,t,s,ans;
int a
,c
;
char ch;
int ef(int l,int r,int x)
{
if (l==r) return l;
int mid=(l+r)/2;
if (x>c[mid]) return ef(mid+1,r,x);else return ef(l,mid,x);
}
int main()
{
scanf("%d",&n);
fo(i,1,n) scanf("%d",&a[i]);
c[0]=-2147483647;
ans=0;
fo(i,1,n)
{
j=ef(1,ans+1,a[i]);
c[j]=a[i];
if (j==ans+1) ans++;
}
printf("%d",ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: