DP优化简记
在 OI 中,DP 优化分为很多种,都是十分重要的。下面将按照难度从小到大介绍。
前缀优化
对于一类 \(fi=\min_{j<i}{fj}+val_i\) 或者 \(fi=\sum_{j=l(i)}^{i-1} fj+val_i\) 之类的问题,可以预处理前缀最小值或者前缀和,使转移优化掉一维。
数据结构优化
对于一些多维状态的动态规划,可以观察这种式子的特点,将其中一维放到数据结构上,然后转移,比如需支持区间求最小值,单点修改,区间覆盖等。常见的数据结构有线段树、吉老师线段树、平衡树。
斜率优化
对于一类 \(f_i=\min_{j<i}f_j-F(i)G(j)+H(i)\) 的问题,可以考虑使用斜率优化,考虑对直线解析式进行移项:\(b=y-k\cdot x\),于是我们对于每个点 \(j\),以 \((G(j),f_j)\) 作为平面直接坐标系的点,再以斜率为 \(F(i)\) 的直线去截,那么 \(f_i\) 的值就是对于所以点 \(j\) 所得到的最小截距,此时容易发现不在下凸壳上的点一定不优,于是我们维护下凸壳,若此时斜率递增,直接单调队列/单调栈即可,否则则需要在栈上进行二分。
四边形不等式优化#1
对于一类 \(f_i=\min_{j<i} val_{j,i}\) 的问题,可以观察价值函数的性质,如有对于任意的 \(a\le b\le c\le d\),均满足:\(val_{a,c}+val_{b,d}\le val_{a,b}+val_{c,d}\),则称其满足四边形不等式,且对于每个 \(i\),若 \(fi\) 取到最优的转移点 \(j\) 随着 \(i\) 的增加而单调不降。
这有什么好的性质呢?有两种做法来解决。
分治
我们考虑分治求答案,已知当前要求的区间为 \([l,r]\),最有决策点的范围为 \([L,R]\),那么对于当前区间的中点,我们可以先暴力求出最优决策点,然后分治下传即可,复杂度 \(\Theta(n\log n)\)。
如果价值函数不能 \(O(1)\) 求,但是可以在低复杂度内移动左右端点求,那么可以采用类似莫队,维护当前求得的区间 \([l,r]\),转移时暴力移动指针,复杂度均摊 \(\Theta(\log n)\),如 Artistic Partition 这题。
二分队列
四边形不等式优化#2
对于一类 \(f_i=\min_{j<i} f_j+val_{j,i}\) 的问题,若 \(val\) 价值函数满足四边形不等式,那么该价值函数 \(f_j+val_{j,i}\) 也同样满足四边形不等式,但是这时候就不能用简单的分治来求解,因为你无法在分治过程中计算价值(其依赖前面的 \(f\) 值),只能使用二分队列。

浙公网安备 33010602011771号