涂色

这一道题目可以感觉到,如果没有覆盖全部区间的一次涂色,那么一定会有一个分界点

考虑覆盖编号为1的方块的最后一次极长操作,假设为[1,r](“极长”指不会缩短,也就是说最终的方案中,位置r不会被其他操作覆盖,也就是说位置r的最后一次操作也是覆盖位置1的最后一次操作;如果不是极长操作,我们最后一次覆盖位置1的操作就可以不用延伸到位置r,不影响答案)且r<n,此时如果存在某个操作,其左端点小于等于r,右端点大于r,我们只需要把这个操作的左端点变成r+1就好了,也就是说r就是分界点

或者直接考虑最后一次操作,分其是否碰到了端点分类讨论就可以了

因此如果不存在覆盖全部区间的一次涂色,我们像正常的操作一样枚举分段点就可以了

那么什么时候才会存在覆盖全部区间的一次涂色呢?此时一定有两端点的颜色相同(不然覆盖全部区间的一次涂色没有意义,完全可以缩短或者不要)

此时我们考虑区间[l,r],其最优方案中,覆盖l这个点的最后一次操作一定是l的颜色,我们把这个操作放到最开始做,并且让这个操作的右端点变成r,显然方案也是合理的,所以有f[l][r]=f[l][r1](当然注意此时换了顺序之后,这个操作可能要缩短一点,其他操作也可能要缩短一点,总之来说左端点附近就不要有重合了)

然而这道题目还可以像消木块那道题目一样考虑最后一段颜色相同的区间什么时候消去,枚举前面颜色相同的区间连起来即可

update 2024.8.29

像这样猜“没有覆盖整个区间的操作就有操作分段点”也是区间DP非常重要的一个trick

posted @   最爱丁珰  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示