int LIS(const int a[],int n)
{
int lis[n],pre[n],js=1;
lis[1]=1;
for(int i=2;i<=n;i++)
{
int l=1,r=js,m;
while(l<r)
{
m=(l+r)>>1;
if(a[lis[m]]<a[i]) l=m+1;
if(a[lis[m]]>a[i]) r=m;
}
if(r==1)
{
if(a[lis[1]]>a[i])
{
lis[1]=i;
continue;
}
}
if(r==js)
{
if(a[lis[js]]<a[i])
{
lis[++js]=i;
pre[i]=lis[js-1];
continue;
}
}
lis[r]=i;
pre[i]=lis[r-1];
}
return js;//返回长度
}
LIS(最长上升子序列)模板
最新推荐文章于 2024-01-27 19:31:12 发布