讲课,ps
什么是区间dp
区间
石子合并问题
有若干个石子排成一行,每个石子有一定的质量,现在要将它们合并成一堆,每一次合并产生的价值是两堆石子的质量和(只能合并相邻的石子),求最大/最小价值。
以最小值为例,对于这个问题,如果我们用
初始值:
时间复杂度
如果石子排成了一个环呢?
环形石子合并问题
一般来说,有下面几种转换方法:
- 把环变成链,枚举那个缺口,时间复杂度
; - 考虑到变成环之后,问题转换为求
条链上的石子合并问题,那么可以把长度为 的链拆开,复制一次,变成长度为 的链,用石子合并的方法求出 后,求出 ,时间复杂度 ;
显然第二种更好。
洛谷-P1880-[NOI1995] 石子合并
1 |
|
问题拓展
AcWing-320-能量项链
本题和前面的合并略有不同,待合并的两个区间不是由点构成,而是由点与点之间的空隙构成。因此区间长度至少是3,至多是
1 |
|
LibreOJ-10149-凸多边形的划分
可以将一个多边形的划分拆为三部分:左,中(三角形),右。最小价值即为这三者的价值和,于是可以发现转移方程和能量项链类似:
注意,本题数据较大,需要做高精度。
1 |
|
AcWing-479-加分二叉树
这个题乍一看似乎和动态规划没有关系,但我们仔细分析“中序”,可以发现,正如区间中用点分割,中序遍历中,左右子树和根正好可以通过区间型动态规划的经典处理方式划分。因此用
1 |
|
DCOJ2008. 蜜雪冰城
1 |
|
AcWing-321-棋盘分割
先来一波推导。
本题的划分分为横向和纵向,同时区间也由一维扩展到了二维,因此实现时可以用记忆化搜索的方式减少代码量。用
1 |
|
洛谷-P1436-棋盘分割
这个跟上面一题其实是一样的,经过数学推导,上题求均方差,也就是求平方和,但均方差可以直接求。
1 |
|
区间型动态规划的两种实现方式
迭代式(推荐)
1 | for (int len = 1; len <= n; len++) |
记忆化搜索式(适合状态定义较为复杂的情况)
如果状态定义中数组维数太多,需要些很多重循环,这时可以用记忆化搜索的形式来写。
2D/1D 的四边形不等式优化
其中
警告!下面的证明都很繁琐且没啥用(完全不影响做题),可以只记结论
2D 状态四边形不等式判定
对于
若
证明(又臭又长):
当
由于
若
的最优决策为 ,则
,发现 的决策只有 ,故 ,综合两式,有同样因为
,有由于
满足四边形不等式,有故
,即 满足四边形不等式若
的最优决策为 ,同理有同样由
满足四边形不等式,得
综上,当
假设当
设
有等式
而对于
当
有
则
当
由数学归纳法原理,原命题得证
QED
2D 决策单调性定理
对于 2D/1D dp 的方程:
记
若
证明:
记
又由
考虑对于
也就是说,对于
QED
实现
2D/1D 的实现没有 1D/1D 那么花里胡哨,就是直接记录
时间也很好分析:
故时间复杂度优化到了
你可能觉得似乎没有 1D/1D 优化的厉害,但其实, 1D/1D 状态数是
最后提醒一点:以上的复杂度分析都没有考虑计算
例题十一
题意同“石子合并”,但要求
话说好像有
艹,好像数据加强了,
思路
呃呃,还要思路吗?
写个方程吧:设
代码
1 |
|