Hoping for the best but expe|

EricQian06

园龄:4年6个月粉丝:24关注:43

2022-04-25 14:47阅读: 121评论: 0推荐: 2

DP 套 DP

DP 套 DP 学习笔记

大致内容

DP 套 DP 就是将一个简单 DP 的状态压缩起来放到新的 DP 中当做状态进行 DP 的过程。

常用于计算简单 DP 的答案为 k 的转移方案的数量。

一般都需要 decoderecode 操作,这里和 插头DP/轮廓线DP 有异曲同工之妙!

例题

P4590 [TJOI2018]游园会

按照以前的套路来,设 dp(i,j,p) 表示现在放完了第 i 位,有长度为 j 的公共子序列,前面两位的状态为 p 的情况数之和。假了呀!万一兑奖串中间取出一段形成公共子序列怎么办捏?

重新考虑这个题,想想假设给我们了兑奖串和奖章串,我们是如何求出 LCS 的:

dpi,j 表示奖章串匹配到第 i 维,兑奖串匹配到第 j 位的最大 LCS 长度。

dpi,j={max(dpi1,j,dpi,j1)(aibj)dpi1,j1+1(ai=bj)

看看最开始我们的状态为什么不能够顺利转移:我们实际上是不知道匹配到了兑奖串的第几位。

那么为了最大化地保留信息,我们设 fi,state,s 表示当前填到了 idpi,[0,k] 一维数组数组状态为 state,已经和 NOI 匹配了 s 位的方案数。

然而 state 是一串数怎么压缩呢?(核心在此!DP 套 DP 的压缩技巧非常关键)

我们发现对于同一个 i 满足:dpi,j1dpi,jdpi,j1+1,也就是说每两项之间最多相差 1

利用这个性质可以将上面 dpi 一位数组差分后用二进制压缩起来。

转移?我们对于一个 state 可以先还原出 dpi1,根据这一次选择的字符推出 dpi,之后同样压缩为新的 state,具体实现时需要预处理出每个 state 加入新字符后推出的新的 state

最终的时间复杂度为 O(n2k),加上大小约为 9 的常数。

本文作者:EricQian06

本文链接:https://www.cnblogs.com/EricQian/p/16190208.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   EricQian06  阅读(121)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起