P2501 [HAOI2006] 数字序列

原题

是思路非常值得学习的一道题


第一问:

首先我们感性上觉得这题应该和LIS有一点关系,但里面有一点问题:

17 50 50 50 18

如果我们求LIS的话,我们会认为只需要改掉50 50 50即可,但其实我们只改掉这些数,我们是无法做到让数单增的

我们发现这个限制写成数学语言即为:aiajij,移项得aiiajj,因此我们令bi=aii,只需求出bi的最长不降子序列,拿n减掉即可


第二问:

这个数据随机我们很难办(我当时以为会用到随机排列的LIS期望长度是O(n)的限制想了半天,结果发现并不是这样),因此我们考虑暴力dp

首先容易想到对于我们所求的最长不降子序列里的两个数bi,bj,我们可以确定在[i,j]的所有数值域都不可能在[bi,bj]之间(废话)

因此我们假设存在一个策略,其中黑线表示我们在操作完后序列的样子,红点表示操作前序列的样子,红色箭头表示变化值的大小(图来自题解)

image

我们发现对于一条黑线,如果在他上面的点比在他下面的点多,我们把他往上移到在他右边线处更优(如II移到III处更优);如果在他下面的点比在它上面的多同理;如果双方点相同,随便移动无影响。

image

因此我们在进行若干次操作后,得到的黑线一定是被分成了两部分:[i,k]的值为bi[k+1,j]的值为bj,可以证明这么做一定是不劣的

因此我们考虑一个O(n3)的暴力dp:设gi表示以i结尾的LIS的所有可能方案的最少操作次数。设S表示fi的所有转移前驱构成集合。我们可以得到转移方程:

gi=minfrmS(mink=frm1igfrm+l=frmk|alafrm|+l=k+1i|alai|)

因为数据随机,每个数被更新的前缀并不多,直接暴力转移即可

最终复杂度O(n3)

u1s1,要是这题把随机性质去掉,数据范围开正常一点的话,是一个好题

posted @   FOX_konata  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示