dp合集(未完结)
数据结构优化DP
对于一些dp转移方程,\(dp_i=\max\{dp_j+k\},l_i\le j\leq r_i\) 且\(l_i,r_i\)保证单调不降。
我们可以考虑使用单调栈或单调队列来维护dp转移,相当于维护区间最值,把时间复杂度由 \(O(n^2)\) 降低到 \(O(n)\)
一般对于可以用单调数据结构来维护的主要难点在于初始dp的设计,当出现上述类似转移方程后,直接优化比较容易做到。
一个比较重要的应用。我们在前面背包问题中的多重背包时,我们通过二进制拆分把时间复杂度优化到了\(O(nm\log C)\) ,在这里我们介绍如何使用单调队列将其进一步优化为 \(O(nm)\)
主要来看几道例题
P5858 「SWTR-3」Golden Sword
考虑状态设计,观察到有一个炉内数量的限制,不太好维护,就把它放到dp维度上,设\(dp_{i,j}\)表示前\(i\) 个原料已经放完,且此时炉内由 \(j\) 种原料的最耐久度,不难列出如下转移 $dp_{i,j}=max{dp_{i-1,k}+j*a_i },j-1\le k\leq j+s $ 这时直接转移复杂度为\(O(n^3)\) ,我们用单调队列维护转移即可优化成\(O(n^2)\),可以通过。
线段树
DP of DP (dp套dp)
通俗一点来说,就是把一个dp的状态放到另一个dp的维度中,也就是我们把dp状态状压下来,进行转移。
P10614 BZOJ3864 Hero meet devil
四边形不等式优化dp
定义:
设 \(w(x,y)\) 为定义的一个二元函数,
若对于任意 \(a\leq b\leq c\leq d\) 均满足 \(w(a,c)+w(b,d)\leq w(a,d)+w(b,c)\) ,
则我们称 \(w\) 函数满足四边形不等式。
定理:
若定义域上任意整数 \(a,b\) 且 \(a<b\) , 都有 \(w(a,b)+w(a+1,b+1)\leq w(a,b+1)+w(a+1,b)\) 成立,则函数 \(w\) 满足四边形不等式。
证明:
对于 $a<c $ ,有 \(w(a,c)+w(a+1,c+1)\leq w(a,c+1)+w(a+1,c)\)
对于 \(a+1<c\),有 \(w(a+1,c)+w(a+2,c+1)\leq w(a+1,c+1)+w(a+2,c)\)
两式相加,得到 \(w(a,c)+w(a+2,c+1)\leq w(a,c+1)+w(a+2,c)\)
以此类推,对于任意的 \(a\leq b\leq c\),都有 \(w(a,c)+w(b,c+1)\leq w(a,c+1)+w(b,c)\)
同理,可得 \(a\leq b\leq c\leq d\) ,有 \(w(a,b)+w(a+1,b+1)\leq w(a,b+1)+w(a+1,b)\) ,得证。、
决策单调性:
我们得到了上面的四边形不等式,那它有什么性质呢。
在转移方程 \(f_i=\min\{f_j+w(j,i)\},j\leq i\) 中,且函数 \(w\) 满足四边形不等式,则 \(f\) 具有决策单调性。
证明:
定义 \(p_i\) 表示 \(i\) 的最优决策点。
$\forall i\in[1,n],\forall j\in[0,p_i-1] $,因为 \(p_i\) 为最优决策点,可得 \(f_{p_i}+w(p_i,i)\leq f_j+w(j,i)\)
\(\forall i'\in[i+1,n]\), 由 \(w\) 满足四边形不等式,可得 \(w(j,i)+w(p_i,i')\leq w(j,i')+w(p_i,i)\)
移项,可得 \(w(p_i,i')-w(p_i,i)\leq w(j,i')-w(j,i)\)
与一式相加可得 \(f_{p_i}+w(p_i,i')\leq f_j+w(j,i')\)
所以,\(i'\) 的最优决策点 \(p_{i'}\geq p_i\) ,\(f\) 具有决策单调性。
求解:
由上面的推导,我们得知 \(f\) 具有决策单调性,那我们考虑如何使用这个性质。
方法一:分治
假设我们知道了 \([l,r]\) 的最优决策都在 \([L,R]\) 上,设 $p_{mid} $ 为区间中点的最优决策点,则 $\forall i\in [l,mid] $ 最优决策点\(p_i\in[L,mid]\),\(\forall j\in [mid+1,R]\) 最优决策点 \(p_j\in [mid,R]\) 。
我们就得到了一个规模更小的问题,递归分治即可。
每次求解一个区间中点 \(p_{mid}\) 的时间复杂度为 \(O(n)\),总时间复杂度为 \(O(n\log n)\)
方法二:单调队列
如果\(f(i)\) 的值需要先求出前边的函数值。那么上面的分治法就不再适用。
我们考虑正序求解,对于\(i\) 对应转移区间 \(l_i-r_i\) ,由决策单调性可得,整个序列会分成若干个\(l_i-r_i\) 转移区间,且 \(i\) 一定单调递增。那我们考虑边扫边用单调队列维护转移区间。进行如下操作。
- 判断队首是否还会有贡献,无贡献,出队
- 将队首所对应转移区间的左端点,改为 \(i\)
- 判断队尾和当前点谁更优。若队尾左端点比当前劣,直接出队;若队尾左端点优右端点劣,二分找到临界点,更改队尾
- 将当前节点入队
通过这样,我们就完成了使用单调队列的维护。
例题:
P3515 [POI2011] Lightning Conductor
我们来观察这个式子\(\forall j\in[1,n],a_j\leq a_i+p_i-\sqrt{|i-j|}\)
移项,\(p_i\geq a_j+\sqrt{|i-j|}-a_i\) ,那我们对于每个 \(i\) 找到 \(a_j+\sqrt{|i-j|}\) 的最大值即可。
设 \(f_i=\max(a_j+\sqrt{|i-j|})\)
绝对值比较麻烦,我们考虑分成大于 \(i\) 和小于 \(i\) 的两部分来解决,就可以方便的处理绝对值。
\(f_i=\max(a_j+\sqrt{i-j})\)
设 \(w(i,j)=\sqrt{j-i}\) ,我们来证明这个函数满足四边形不等式。
$w(i,j)+w(i+1,j+1)=2*\sqrt{j-i} $
\(w(i,j+1)+w(i+1,j)=\sqrt{j-i+1}+\sqrt{j-i-1}\)
\(w(i,j)+w(i+1,j+1)-w(i,j+1)-w(i+1,j)=\sqrt{j-i}-\sqrt{j-i-1}-(\sqrt{j-i+1}-\sqrt{j-i})\)
我们可知\(g(x)=\sqrt x-\sqrt {x-1}\) 为减函数。
所以有 \(w(i,j)+w(i+1,j+1)\geq w(i,j+1)+w(i+1,j)\) 恒成立
所以函数 \(w\) 满足四边形不等式,直接用单调队列或分治处理即可。
这里考虑到大部分四边形不等式比较容易证明,后面例题将不再给出具体证明过程。
Yet Another Minimization Problem
斜率优化dp
概率dp
动态dp
简单来说,一些dp问题的转移方程
计数dp
计数dp的技巧不算太多,主要来看例题。
P10982 Connected Graph
求 \(n\) 个结点的有标号无向连通图个数。
直接求不太好解决,我们考虑容斥,我们来考虑 \(n\) 个点的无向图共有 \(2^{\frac{n*(n-1)}{2}}\) 个,我们把其中不连通的图减去,剩下的就是连通图,我们可以发现,每一个无向不连通图都有若干个联通块组成,我们从这条性质出发,以一号节点为基准,枚举其所在连通块大小,可以做到不重不漏进行统计,设一号节点连通块大小为 \(i\) ,则剩下的 \(n-i\) 个点之间边可以任意相连,则共有 $f_iC_{n-1}^{i-1} 2^{\frac {(n-i)*(n-i-1)}{2}} $ 种不连通情况,减去即可,最终答案就为 \(f_n\) ,时间复杂度 \(O(n^2)\),这题可以通过多项式解法,优化到 \(O(n \log n)\) 这里不再介绍。
P10956 金字塔
题目给了你一个树的深度优先遍历序列(每次经过一个点都会记录),让你求原树可能的形态有多少种。
在深度优先遍历中,我们对于一个点一定会在遍历完一个子树后回到当前节点,所以一个节点的所有子树,一定对应所给出序列上的一段连续区间,我们从这个性质入手考虑区间DP,设 \(f_{i,j}\) 表示 \(i,j\) 区间可能的树的形态。不难得出下列转移。
我们对于第二种情况,\(f_{i+1,k}\) 相当于是枚举的 \(i\) 的第一个子树,对于 \(f_{k+1,j}\) 则是将剩下的部分再挂到 \(i\) 上,乘法原理计数即可。我们来想一想为什么必须只枚举第一个子树呢,如果我们枚举的不是第一个子树,而是 \(f_{i,k}\) 相当于是前一部分子树,那我们可能就会出现重复统计的情况。从这里我们也可以看见,对于计数类dp来说,选择一个基准点,不重不漏是尤为关键的。

浙公网安备 33010602011771号