首页 > 其他分享 >简单理解 DP 套 DP

简单理解 DP 套 DP

时间:2023-03-31 18:25:21浏览次数:65  
标签:max le 记录 text times 理解 简单 DP

复制粘贴的:

通过一个外层的 DP 来计算使得另一个 DP 方程最终结果为特定值的输入数。

例如求有多少种输入使得一个背包 DP 恰好答案为 \(K\)。

外层 DP 的状态是所有子 DP 的状态的值。

子 DP 状态数很少,通常经过滚动数组优化,比如 \(3n\) 变成 \(2\times 3\))

通常我们有技巧地枚举子 DP 的输入,比如逐位考虑输入。

由于我们只对 DP 方程的最终结果感兴趣,我们并不需要记录子 DP 的输入数据,只需要记录转移以后,DP 每个状态的值就可以了。

例:BZOJ3864

题目大意:

给定字符串 \(S\) 与正整数 \(m\),你需要对每个 \(i=0,\cdots,|S|\) 求出:

  • 有多少个长为 \(m\) 的字符串 \(T\) 使得 \(\text{LCS}(S,T)\) 长度为 \(i\)。\(\text{LCS}\) 指最长公共子序列。

\(1\le m\le 1000,1\le |S|\le 15\)。

回忆 \(\text{LCS}\) 的 DP: \(f(i,j)\) 表示 \(S[1\cdots i],T[1\cdots j]\) 的 LCS 长度,有转移:

\[f(i,j)=\begin{cases}f(i-1,j-1)+1&,S[i]=T[j]\\\max(f(i-1,j),f(i,j-1))&,S[i]\neq T[j]\end{cases} \]

我们应当记录的是,目前长度为 \(i\),且和 \(S\) 的 LCS 是某个数组的字符串数量。

注意到这个转移之和上一行相关,因此只需要记录最后一行,即对每个 \(f(\cdot,j)\) 的所有状态,都记录下来。暴力记录需要 \(O(|S|^{|S|})\) 个状态,注意到差分数组只会是 \(0,1\),因此考虑记录差分数组,即可做到 \(O(2^{|S|})\)。用 \(O(|\Sigma|\times |S|2^{|S|})\) 时间预处理所有状态的后继,总的时间复杂度为 \(O((m+|S|)2^{|S|}\times |\Sigma|)\)。

  • 附送简单题 游园会,记录末尾是不是 N,NO 即可。

试看看!

我觉得大标题后紧跟小标题很不好看,因此我要在这里加一行字。

優しさの記憶

dp of dp 套一层数位 DP。不难想到枚举 \(i=1,\cdots,n\) 算贡献。

考虑怎么算最长公共子串,设 \(f(i,j)\) 表示两个串 \(s,t\) 以 \(s_i,t_j\) 结尾的最长公共子串,那么

\[f(i,j)=\begin{cases}f(i-1,j-1)+1&,s_i=t_j\\0&,s_i\neq t_j\end{cases} \]

我曾一度以为状态数应当是 \(5^4=625\),但注意到 \(f(i,j)\le \min(i,j)\),因此状态数不超过 \(2\times 3\times 4\times 5=120\)。由于这个只代表某两个位置结尾的最长公共子串,还要记录全局 \(f\) 的最大值。

额,但是算出来是 \(n\times \lg m\times |\Sigma|\times \lg n\times 120\times 2\times 2\times\ge 4\times 10^9\),有点恐怖!不过 CYJ 说能过

另一种做法:枚举之后把每个后缀插入 acam,标记一下每个点在 trie 上的深度,记录一下当前走过路径上的 maxdep 即可。复杂度是 \(O(n|\Sigma|\lg n\lg m)\)。

輪廻

额我也不知道这题算不算 dp of dp

不难发现剩下的数必然是 \(n\),考虑对一个排列怎么算次数:建出笛卡尔树,发现只要一个节点的左子树或者右子树被删空了,那么它就会被删除。在笛卡尔树上 DP,设 \(f_u\) 表示删空 \(u\) 子树需要的次数,则当 \(u\) 不在左右边缘时 \(f_u=\max(f_{\text{lson}(u)},f_{\text{rson}(u)},\min(f_{\text{lson}(u)},f_{\text{rson}(u)})+1)\),否则 \(f_u=f_{\text{lson/rson}(u)}+1\)。

现在要计数有多少个排列的笛卡尔树能够使得 \(f_{\text{root}}=k\)。发现 \(f\) 的转移式中 \(\max\) 取到第三种情况当且仅当 \(f_{\text{lson}(u)}=f_{\text{rson}(u)}\),因此设 \(F(i,j)\) 表示 \(1\cdots i\) 的排列,最终 \(f_{\text{root}}=j\) 的方案数;转移时枚举最大值的位置,有

\[F(x,j_0)\times F(y,j_1)\times\binom{x+y+1}{x}\to F(x+y+1,\max(j_0,j_1,\min(j_0,j_1)+1)) \]

然后是一个很厉害的结论,注意到删除次数不超过 \(O(\log n)\)(由于一个序列至多有一半的数是极大值),因此暴力转移就是 \(O(n^2\log ^2n)\),前缀和优化一下可以 \(O(n^2\log n)\)。

由于 \(u\) 在最左侧时转移式不同,因此需要多记录 \(G(i,j)\) 表示 \(i\) 在最左侧的方案数。

LOJ3724

有个暴力:\(f(u,x,y)\) 表示给以 \(u\) 为根的子树填数,选 \(u\) 时的最大权独立集大小为 \(x\),不选 \(u\) 时为 \(y\) 的方案数。转移就直接写一下树上最大权独立集那个 DP,有

\[f(u,x_1,y_1)\times f(v,x_2,y_2)\to f(u,x_1+y_2,y_1+\max(x_2,y_2)) \]

发现复杂度是 \(O(n^3k^4)\)。

然后发现,当 \(x\le y\) 的时候记录 \(x\) 没有意义,若 \(x>y\),那么 \(x-y\le k\)。因此可以记录 \(f(u,j,y)\) 表示以 \(u\) 为根的子树填数,选 \(u\) 时的最大权独立集大小为 \(y+j\)(\(j>0\)) 或者 \(\le j\)(\(j=0\)),不选 \(u\) 时为 \(y\) 的方案数。转移式类似:

\[f(u,j_1,y_1)\times f(v,j_2,y_2)\to f(u,\max(0,j_1-j_2),y_1+y_2+j_2) \]

复杂度 \(O(n^2k^4)\)。

标签:max,le,记录,text,times,理解,简单,DP
From: https://www.cnblogs.com/YunQianQwQ/p/17277140.html

相关文章

  • 【做题笔记】树形 dp
    1.luoguP2016战略游戏1.1Solve设计状态\(dp[i][0/1]\)表示在\(i\)子树内,放/不放第\(i\)个节点使其合法所需的最少的士兵数目。则有:不选\(i\)节点,则\(i\)的儿子必须选;选\(i\)节点,则\(i\)的儿子可选可不选;因此,转移方程为:$dp[i][0]=\sumdp[son[i]][1......
  • 如何简单快捷批量获取店铺的所有商品?
    相信有很多做电商平台的卖家也有在做其他平台的分销,就是把A平台店铺的东西铺货到B平台卖,那么第一步就需要先把A平台店铺的商品先提取出来,再在B平台上架商品,相信很多小伙伴马上想到的就是把A平台的一个店铺所有的链接都提取出来,一个一个去复制,要是店铺的商品数量少这个办法是可行的......
  • spring MongoDB 集成crud操作(简单封装)
    这两天一直在学习mongodb,由于我的博客网站想把mysql替换成mongodb,为什么会有这样的冲动,我通过收集一些资料,关于mongodb跟mysql的对比...发现性能上mongodb比上mysql是高出很多倍...无论是增,删,修,查的操作.....都比mysql效率好...但是,我也看到,mongodb是文档型数据库...做......
  • wordpress的dockercompose部署方式
    version:'3.1'services:wordpressastra:image:wordpressrestart:alwaysports:-8082:80environment:WORDPRESS_DB_HOST:dbastraWORDPRESS_DB_USER:exampleuserWORDPRESS_DB_PASSWORD:examplepass......
  • 直播网站源码,Android中点击图片放大的简单方法
    直播网站源码,Android中点击图片放大的简单方法简单的思路就是把要放大的图片显示在一个对话框中显示出来 Java代码: publicvoidonThumbnailClick(Viewv){//finalAlertDialogdialog=newAlertDialog.Builder(this).create();//ImageViewimgView=getView();//di......
  • 洛谷 P5642 - 人造情感(换根 dp)
    想起来很轻松,写起来很酸爽的套路题。默认以\(1\)为根。先考虑怎么算单个\(f(u,v)\),我们定义一个连通块的权值为从该连通块中选出若干条点不相交的路径,选出的路径的权值之和的最大值。那么显然\(f(u,v)\)就是整棵树的权值\(-\)挖掉\((u,v)\)这条路径后各个连通块的权值之......
  • vue或者react中的hooks的理解
    我们听过react里面有hooks的概念,那么怎么理解hooks呢? 其实vue2中,我们没有hooks的概念,vue3中我们引入了组合式函数(也就是用组合式api写的),它其实就是vue的hooks。 总结下来,hooks有以下特点:1、hooks其实就是个函数,只是实现它的方法比较特殊,利用组合式api实现的。2、组合式函......
  • 202031603210-李震 实验一软件工程准备-简单认识软件工程
    项目目标课程班级博客链接2020级卓越工程师班本次作业要求链接实验一软件工程准备我的课程学习目标1.学会使用博客园进行学习2.了解GitHub的基本操作3.学习并掌握软件工程的相关知识本次作业在哪些方面帮我实现学习目标通过本次实验,我学习了1.Git......
  • 有关wordpress文章页面出现404的问题
    有关wordpress文章页面出现404的问题修复的时候总结了一下原因:1.未开启apache的rewrite功能2..htaccess文件中的伪静态规则配置错误3.由于目录存在中文,编码问题导致解决方案:1.未开启apache的rewrite功能:使用命令sudoa2enmodrewrite开启mod_rewrite,然后修改配置文件......
  • docker wordpress 快速部署
    1.拉取mysqldockerpullmysql2.拉取wordpressdockerpullwordpress3.启动mysqldockerrun-d--namemysql-p3306:3306-eMYSQL_ROOT_PASSWORD=123456-v/data/mysql_data:/var/lib/mysqlmysql:latest4.启动wordpressdockerrun-d--namewordpress-v/da......