DP-优化
link to cnblog
一些关于DP的小优化:
前缀和优化(用于
bitset优化(01背包(价值能否取到),常数为
单调队列优化(求恒长区间最大/小值)
二进制优化(完全背包问题,
线段树优化:CF1557D
斜率优化:见下文
决策单调性:见下文
树链剖分(DDP)
斜率优化
本蒟蒻终于被迫学习斜率优化了
这类问题的优化的转移方程是:
以本题为例:
一个朴素的转移方程:
其中,
再合并,令
得:
强拆!
移项:
令
那就变成了
我们要最小化
我们可以将
实际上,我们只需要维护下凸壳的那些点,而对于本题,显然
借用 OI-Wiki 中的图:
我们令
显然,我们要找的决策点就是凸壳中满足
因为 DP 只需要从
又因为
注意:队列的初始状态应该是有一个点 (0,0) ,否则
一般化
但如果我们将上述题目的条件改改,使得
当然不是啊,不然我提出这个问题干嘛
对于
但如果
一种方法就是用平衡树维护凸包,就是找到
但用平衡树十分滴复杂,有没有更好写的算法?(其实用 set 是可以实现的)
有!就是我们万能的 CDQ分治
我们假定分治到
注意:这时候
我们先将
然后我们再将
这时候我们就可以正常像上面用单调队列跑 DP 了
转移完后,显然
整个分治的时间复杂度是
当然,我们也可以用 李超线段树 直接跑 DP ,就是将上面的 DP 在树上查询最大/小值,求完后再更新线段树即可
dp 套 dp
适用范围:要求你构造一些满足特殊要求的序列或字符串,并统计出有多少种不同的方案数
也就是说,这是一种计数DP的 trick
我们用这道例题讲解一下
我们先考虑求两个序列的 LCS 的方式:
其中,LCS
显然,一种
而题目又是要我们构造 DP 的状态进行转移
我们就定义
但难不成我们要将所有的
诶,我们这时候就要注意到
是不是又一种直觉,我们可以用状压来记录
事实确实如此!因为我们注意到,
那我们就考虑将
那我们每次 DP 加入一个新的字符时,就枚举上一个字符的所有状态,解压后再求新的状态,进行转移
题目还有一个不能出现 NOI 串的限制,那我们只需要每次都记录最后几位是否为 N、NO 或没有即可
四边形不等式
(学完斜率优化才来学决策单调性的屑)
2D1D 区间转移类
在许多的区间DP中(如石子合并),我们有如下的状态转移方程:
这显然是
但
-
区间包含单调性
当
-
四边形不等式
当
但我们需要的是
-
引理:
若
w_{l,r} 满足上面的两个性质,则f_{l,r} 也满足四边形不等式
令
(由于当
显然,当
下面我们用归纳法证明区间长度为 四边形不等式
-
当
l_1<l_2=r_1<r_2 时A. 若
u < r_1 ,有f_{l_1,r_1}\le f_{l_1,u}+f_{u+1, r_1}+w_{l_1,r_1} ,由归纳法得f_{u+1,r_1}+f_{l_2,r_2}\le f_{u+1,r_2}+f_{l_2,r_1} ,两式相加,有:f_{l_1,r_1}+f_{l_2,r_2}\le f_{l_1,u}+f_{u+1,r_2}+f_{l_2,r_1}+w_{l_1,r_1} 又因为
w_{l_1,r_1}\le w_{l1,r2} ,f_{l_1,r_2}= f_{l_1,u}+f_{u+1, r_2}+w_{l_1,r_2} 所以
f_{l_1,r_1}+f_{l_2,r_2}\le f_{l_1,r_2}+f_{l_2,r_1} B. 若
u\ge r_1 ,有f_{l_2,r_2}\le f_{l_2,u}+f_{u+1, r_2}+w_{l_2,r_2} ,由归纳法得f_{l_1,r_1}+f_{l_2,u}\le f_{l_1,u}+f_{l_2,r_1} ,两式相加,有:f_{l_1,r_1}+f_{l_2,r_2}\le f_{l_1,u}+f_{u+1,r_2}+f_{l_2,r_1}+w_{l_2,r_2} 又因为
w_{l_2,r_2}\le w_{l1,r2} ,f_{l_1,r_2}= f_{l_1,u}+f_{u+1, r_2}+w_{l_1,r_2} 所以
f_{l_1,r_1}+f_{l_2,r_2}\le f_{l_1,r_2}+f_{l_2,r_1} -
当
l_1<l_2<r_1<r_2 时A. 若
u\le v ,则l_1\le u < r_1 ,l_2\le v<r_2(r_1) ,有f_{l_1,r_1}\le f_{l_1,u}+f_{u+1,r_1}+w_{l_1,r_1}\\ f_{l_2,r_2}\le f_{l_2,v}+f_{v+1,r_2}+w_{l_2,r_2} \end{aligned} 由
u+1\le v+1\le r_1<r_2 and 归纳法,有f_{u+1,r_1}+f_{v+1,r_2}\le f_{u+1,r_2}+f_{v+1,r_1} ,前两个不等式相加,将第三个不等式代入,得f_{l_1,r_1}+f_{l_2,r_2}\le f_{l_1,u}+f_{l_2,v}+f_{u+1,r_1}+f_{v+1,r_2}+w_{l_1,r_1}+w_{l_2,r_2}\le f_{l_1,r_2}+f_{l_2,r_1} B. 若
u>v ,则l_2\le u < r_2 ,l_1(l_2)\le v<r_1 ,有f_{l_2,r_2}\le f_{l_2,u}+f_{u+1,r_2}+w_{l_2,r_2}\\ f_{l_1,r_1}\le f_{l_1,v}+f_{v+1,r_1}+w_{l_1,r_1} \end{aligned} 由
l_1<l_2\le v<u and 归纳法,有f_{l_1,v}+f_{l_2,u}\le f_{l_1,u}+f_{l_2,v} ,前两个不等式相加,将第三个不等式代入,得f_{l_1,r_1}+f_{l_2,r_2}\le f_{l_1,v}+f_{l_2,u}+f_{v+1,r_1}+f_{u+1,r_2}+w_{l_1,r_1}+w_{l_2,r_2}\le f_{l_1,r_2}+f_{l_2,r_1}
综上所述,
-
定理:
记
证明:设
-
若
L>M 根据
M+1<L+1\le r-1<r , 有f_{M+1, r-1}+f_{L+1,r}\le f_{M+1,r}+f_{L+1,r-1} 又根据
L 为f_{l,r-1} 的最优决策点,得f_{l,L}+f_{L+1,r-1}\le f_{l,M}+f_{M+1,r-1} 两式相加,得
f_{l,L}+f_{L+1,r}\le f_{l,M}+f_{M+1,r} 这说明
L 比M 对于f_{l,r} 更优,显然矛盾,所以L\le M -
若
M>R 根据
l<l+1\le R<M , 有f_{l, R}+f_{l+1,M}\le f_{l,M}+f_{l+1,R} 又根据
R 为f_{l+1,r} 的最优决策点,得f_{l+1,R}+f_{R+1,r}\le f_{l+1,M}+f_{M+1,r} 两式相加,得
f_{l,R}+f_{R+1,r}\le f_{l,M}+f_{M+1,r} 这说明
R 比M 对于f_{l,r} 更优,显然矛盾,所以M\le R
通过上述的证明,我们在DP的过程中就可以减少枚举决策点的次数,复杂度能够优化到:
-
另一种转移形式
其中
但实际上,如果 区间包含单调性和四边形不等式,四边形不等式,有
由于是逐层转移,我们考虑对第
我们设置状态
我们暴力枚举
时间复杂度就优化到
- 费用计算较难
也就是当
我们可以采用莫队双指针移动的方法
也就是在暴力求
这样一看,似乎复杂度假掉了
但实际上,这还是
因为当我们枚举到
因为右指针不动,只有左指针移动
递归到左儿子的时候暴力移动到
因此平衡到与分治一样的复杂度
1D1D 转移类
如果 四边形不等式,令
证明:令
-
若
L>R ,则R<L<r_1<r_2 ,由四边形不等式有w_{R,r_1}+w_{L,r_2}\le w_{R,r_2}+w_{L,r_1} -
因为
L 是最优决策点,所以有f_L+w_{L,r_1}\le f_R+w_{R,r_1} -
两不等式相加,得
f_L+w_{L,r_2}\le f_R+w_{R,r_2} -
这显然与
R 是f_{r_2} 的最优决策点相矛盾,所以L\le R
但这时我们仅仅确定了下界,最坏情况下仍是
我们考虑使用单调队列,里面记录的是决策点,每个决策点能够转移到的区间为
当我们要转移到
那我们如何更新队列呢?我们就每次取出队尾,比较一下从
但这还没完,因为
时间复杂度则为
快速判断
对于1D1D:详见大佬FlashHu的博客
简而言之,对于每个决策函数
对于2D1D:证明
SOS DP
问题引入:求
我们有
其实我们有一个
我们令
考虑如何转移
最后我们输出