DP 套 DP
DP 套 DP 学习笔记
大致内容
DP 套 DP 就是将一个简单 DP 的状态压缩起来放到新的 DP 中当做状态进行 DP 的过程。
常用于计算简单 DP 的答案为 的转移方案的数量。
一般都需要 decode
和 recode
操作,这里和 插头DP/轮廓线DP 有异曲同工之妙!
例题
P4590 [TJOI2018]游园会
按照以前的套路来,设 表示现在放完了第 位,有长度为 的公共子序列,前面两位的状态为 的情况数之和。假了呀!万一兑奖串中间取出一段形成公共子序列怎么办捏?
重新考虑这个题,想想假设给我们了兑奖串和奖章串,我们是如何求出 LCS 的:
设 表示奖章串匹配到第 维,兑奖串匹配到第 位的最大 LCS 长度。
看看最开始我们的状态为什么不能够顺利转移:我们实际上是不知道匹配到了兑奖串的第几位。
那么为了最大化地保留信息,我们设 表示当前填到了 , 一维数组数组状态为 ,已经和 匹配了 位的方案数。
然而 是一串数怎么压缩呢?(核心在此!DP 套 DP 的压缩技巧非常关键)
我们发现对于同一个 满足:,也就是说每两项之间最多相差 。
利用这个性质可以将上面 一位数组差分后用二进制压缩起来。
转移?我们对于一个 可以先还原出 ,根据这一次选择的字符推出 ,之后同样压缩为新的 ,具体实现时需要预处理出每个 加入新字符后推出的新的 。
最终的时间复杂度为 ,加上大小约为 的常数。
本文作者:EricQian06
本文链接:https://www.cnblogs.com/EricQian/p/16190208.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?