有麻烦请先笑笑

萩 x H

我的时间很少,但我却有很多想法

求出所有LIS的可行起点

在做到codeforces1488E Palindromic Doubles 的时候,需要求出一段序列所有LIS的可行起点,没学过相关的做法,自己想了一个。
假设我们已知一个lis数组,其中lis[i]代表以a[i]结尾的最长LIS,vis[i]=true代表a[i]可以是某条LIS的其中一点,Max[i]代表lis值等于i时的最大值。
则对于a[i],当 j>i && lis[j]=lis[i]+1 && Max[lis[j]]>a[i] 时,vis[i]=true;
这样将数组从后往前枚举,同时维护vis,Max,最后求出的vis数组中,如果vis[i]true && lis[i]1 ,它就是可行的LIS起点。
维护代码如下:

for(int i=cnt;i>=1;--i)
	{
		if(LIS[i]==ans)
		{
			Max[LIS[i]]=max(Max[LIS[i]],b[i]);
			vis[i]=1;
			continue;
		}
		if(b[i]<Max[LIS[i]+1]) 
		{
			Max[LIS[i]]=max(Max[LIS[i]],b[i]);
			vis[i]=1;
		}
	}

对于求lis数组,只要在二分查找求LIS的代码上改一点点就好了:

for(int i=1;i<=cnt;++i)
{
	if(b[i]>dp[ans]) dp[++ans]=b[i],LIS[i]=ans;
	else
	{
		int x=upper_bound(dp+1,dp+1+ans,b[i])-dp;
		dp[x]=b[i];
		LIS[i]=x;
	}
}
posted @   萩xh  阅读(72)  评论(0编辑  收藏  举报
编辑推荐:
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
阅读排行:
· 不到万不得已,千万不要去外包
· C# WebAPI 插件热插拔(持续更新中)
· 会议真的有必要吗?我们产品开发9年了,但从来没开过会
· 【译】我们最喜欢的2024年的 Visual Studio 新功能
· 如何打造一个高并发系统?
点击右上角即可分享
微信分享提示