DP小结

pdf

一 状态类型:
1.序列
2.区间
3.坐标
4.数轴
5.树形
6.数位
7.状压;
8.记忆化搜索

1.序列DP
一般来说,有两种编号的状态:
1.状态[i]表示前i个元素决策组成的一个状态;
2状态[i]表示用到了第i个元素,和其他在1到i−1间的元素,决策组成有的一个状态.
各种背包~~
LIS:
• 以一元组[i] 作为状态,表示第i个作为序列的最后一个点的时候的最长序列;(引入一个单调的辅助数组,利用单调性二分查找,优化到
O(nlogn).
LCS
• 状态[i,j] 表示第 1 个字符串的第i 位, 与第2个字符串的第j位匹配, 得到的最长的串(若有多个串要LCS,则加维,即几个串就几个维).

2.区间DP(与坐标的划分问题的决策的分割点无序较为相似.)(按照len,lr,k枚举)
f[l][r] 表示一段连续区间[l,r]上的答案
1 序列:区间[l,r]的最后一步处理的是k元素/分割点是k/受k控制的(常用四边形不等式优化)
2 环: 复制一倍粘到后面,len<=n,枚举断点
3 点集回路: 利用线段不交的性质按顺序DP

3.坐标DP
• 状态是由坐标维与其他的维组成.
• 划分问题(2维或多维的坐标系的划分)与路径问题的交集占本类问题中大多数.
• 找坐标状态之间的关系: Apio2009-oil(计算二维前缀和,DP左上,左下右上,右下;区间DP三分块横纵,分讨即可)

4.数轴DP
1.01 背包: 将Value 作为 dp 的状态
• 有时候可以用bitset 优化
• 装箱问题、币值分割、⋯⋯
• 1304
• 听说排序后有惊喜?
• 剩余系下跑spfa: BZOJ2118
2.博弈论:与SG函数结合

5.树形DP(dp[i]j)
1.动态规划的顺序: 一般按照后序遍历的顺序,即处理完儿子再处理当前节点,才符合树的子结构的性质.
2 加当前点的选或不选、选几个子树内的节点的常数维,解决后效性问题.
3.要记录的东西: 子树内的信息(&子树外的信息)
4.可以把子树看成背包,信息合并时一颗颗并上去(树上背包)
5.复杂度: 树型动态规划复杂度基本上是O(n),若有附加维m,
则是O(nm).(遍历树上n个节点)
6.无根树的处理: 先随便找个根,按有根树处理,从叶子节点处理上去, 最后再由根从上往下dp一遍,如求一棵树中每个节点的最远点.(换根DP)

5.数位DP
类似背包+树+递推

6.状压DP
1。数据特殊性: 给出的数据在某一个或几个维度上一般具有比较小的范围(可以枚举一类的状态),但是无法用该范围的数值刻画全部状态.
2。状态: 选/不选/还没考虑
• TSP(旅行商)类: 将一个集合与一个点合并成新的一个集合
• 子集dp转移复杂度为O(3^n)
• 有可能要记录下该集合内最后一个转移到的点
• 炮兵阵地类: 直接枚举该行的所有状态进行转移
• 插头DP:就是把上面的方法改改,把按“行”转移改成按“行+格”转移
• 连通性?

6.记忆化搜索
• 1802
• 一个Tip: 考虑f(n) 与 f(n-1) 和 f(n/2) 之间的关系, 缩小问题规模

二 转移方式:
1.递推
1)通常都是把题目的输入数据作为状态
2)考虑状态之间的转移: 在原状态添加一个新的元素会有怎样的影响
3)有些可以直接转换为数学问题,考察数学功底

2.划分问题:求分割、合并点

决策的分割点有序:
1)有序性: 每次决策的点的编号是有序的,即要按决策的顺序输出分割点的编号的话,编号是有序的,满足分割点的编号按升序排列.
2)方程一般形式:
f[n][m]=optimize{f[k][m−1]+w(k+1,n)}
f[n][m]表示从 1 到 n 个点中划分为 m 个部分的最优值,k为决策的分割点,即第m个部分为k+1到n,这里optimize可以为max/min.
3)一般可以使用斜率优化: 1838、2021

决策的分割点无序:
1)无序性: 每次决策的点的编号是无序的,即要按决策的递归顺序输出分割点的编号的话,编号是无序的.
2)方程一般形式:
f[i][j]=optimize{f[i][k−1]+f[k+1][j]}+w(i,j)
f[i][j]表示从i到j的范围内选取一个分割点k的最优值,子问题是分割点左边[i,k-1] 和右边 [k+1,j] 的点的范围的最优值.这里optimize 可以为 max/min.
该方程很类似二叉树的性质: 加分二叉树
3)此类问题有些可用四边形不等式优化.
3.路径问题:
1)行走方向决定阶段性: 有规定源点与终点,每次行走方向都有一定的规定,使原点到终点的所有路径形成DAG.
2)多源或多汇: 当多源或多汇时,应该加维,使得每个源都有一个路径的状态与之对应。
如有n个源的网格类问题,常常状态是(x1,y1)(x2,y2)⋯(xn,yn). 但是源太多的话, 空间上不允许, 可以将问题转成网络流问题.
3)双向动态规划: 由于有规定源点与终点,可以双向动态规划,有时由于可用于决策的状态较少,效果就不错了.
屏幕截图_19-8-2026_131345_
4)决策稀疏性: 若对于一个状态,它的前驱或者后继数很少(从无环有向图角度就是入度或出度少),称决策稀疏.
5)状态稀疏性: 很多状态是没有用的,如排列的LCS,状态为2维的(x,y), 但对于一个 x 只有一个y, 是有限个. 所以实质上状态数还是线性的.

三 DP 优化

1.减少状态转移数
四边形不等式:
• 当函数w(i,j)满足w(a,c)+w(b,d)≤w(b,c)+w(a,d),且a≤b<c≤d时,称w(i,j)满足四边形不等式.
• 当函数w(i,j)满足w(i′,j′)≤ w(i,j),且i≤i′<j′≤j 时, 称w关于区间包含关系单调.
• s(i,j) = k 是指 f(i,j) 这个状态的最优决策

• 定理一: 如果w(i,j) 同时满足” 四边形不等式”和”决策单调性”, 则 f(i,j) 也满足四边形不等式
• 定理二: 当定理一的条件满足时,让f(i,j)取最优值的k为s(i,j),则 s(i,j−1)≤s(i,j)≤s(i+1,j)
• 定理三: w为凸当且仅当
w(i,j)+w(i+1,j+1)≤w(i+1,j)+w(i,j+1)
• 由定理三知,判断w是否为凸即判断w(i,j+1)−w(i,j) 的值随着i的增加是否递减
• 于是求k值的时候s(i,j) 只和 s(i+1,j) 和 s(i,j-1) 有关, 所以可以以i-j 递增为顺序递推各个状态值最终求得结果,将O(n3)降为O(n2)
• 例题: 1034, 1044, 1160, ...
• 小心发现,大胆猜想,不用证明!
• 实践是检验真理的唯一标准

决策单调性:
• 做动态规划时常常会见到形如这样的转移方程:
f[i] = optimize{g(j)|L[i] ≤ j < i} + w[i]其中L[i] 随 i 单调不降, 即 L[1]≤L[2]≤···≤L[n], g(j) 表示一个和j或f[j] 有关的函数, w[i] 表示一个和 i 有关的函数
• 有这样一个性质: 如果存在两个数j,k,使得k≤j,而且g(k) ≤ g(j) (opt = max) 或 g(j) ≤ g(k)(opt = min), 则决策 k是毫无用处的.
• 根据L[i] 单调的特性, 如果k可以作为合法决策,那么j一定可以作为合法决策,又因为j比k要优(注意: 在这个经典模型中,“优”是绝对的,与当前正在计算的状态无关),因此如果把表中的决策按照j排序的话,则g(j)必然不降.
屏幕截图_19-8-2026_132431_
屏幕截图_19-8-2026_132514_

• 结论: 设k<j<i, 如果 K(i,j) <K(j,k), 那么 j 点便永远不可能
成为最优解,可以直接将它踢出我们的最优解集.
1 如果K(i,j) < sum[i], 那么就是说 i 点要比 j 点优, 排除 j 点.
2 如果K(i,j) ≥ sum[i], 那么 j 点此时是比 i 点要更优, 但是同时由假设有K(j,k) > K(i,j) ≥sum[i]. 这说明还有 k 点会比 j 点更优, 同样排除j点.
• 因此在新的单调队列中,相邻三个点i,j,k满足K(j,k)≤K(i,j),这是一个下凸壳
• 剩下的就跟之前讲的没什么两样了
• min 为什么是下凸壳? f[i]=min{f[j]+k[i]x[j]|1 ≤ j < i}+b[i]
• 最小化f[j]+k[i]x[j]. 把式子变形有 f[j] = −k[i]x[j]+f[i]
等价于求直线y=−kx+b截点集{(x[i],f[i])} 最小的 b
• max 反过来
• 注意在推导的时候,不等式两边同乘负数会变号
• 不是sum[i], 是 h[i], h[i] 不具有单调性: 二分出端点, 剩下一样.
该是什么壳就是什么壳

减少计算递推式时间
部分和优化
比如预处理表达式中的某些元素
矩阵快速幂
• 如果dp转移方程中全是常系数,那么该方程就能很方便的转化为矩阵相乘的形式,求第n项的时候就能运用矩阵快速幂在log(n) 的时间内得到结果, 而不用 n 次一次一次递推了.
• 特殊的矩阵乘法也能由O(n3)降至O(n2), 运用特征方程即可,详见叉姐(郭晓旭)的论文.
• 1982, 2172
• 利用自动机的fail 树来构造转移矩阵,套矩阵快速幂. 2081
• 树状数组f[i]=opt{f[j]+|g(j)|} 分类讨论求极值
• BZOJ3688 前缀和还带动态修改的
• 线段树f[i]=opt{f[j]+g(j+1,i)}, 考虑从 i-1 到 i 之间被修改元素
• 多组询问的括号序列/子段和: 把问题分成左右两边,在合并的时候统计答案即可,利用分治思想
• 平衡树?

posted @ 2026-08-19 13:28  xmd11  阅读(14)  评论(0)    收藏  举报