Skip to main content

DP 优化

参考资料

斜率优化

当 DP 转移形如 fi=minj{fj+w(i,j)}f_i=\min_j\set{f_j+w(i,j)},且把含 jj 的项整理后能写成「关于某个随 ii 单调的斜率的一次函数」时,可用 斜率优化

把每个决策 jj 看作平面上一个点,最优转移等价于在这些点构成的 下凸壳 上找到与给定斜率相切的点。当斜率与横坐标都单调时用单调队列维护凸壳,均摊 O(1)O(1) 转移,总复杂度降到 O(n)O(n);否则可在凸壳上二分。

四边形不等式优化

若代价函数 ww 满足 四边形不等式:对 abcda\le b\le c\le dw(a,c)+w(b,d)w(a,d)+w(b,c)w(a,c)+w(b,d)\le w(a,d)+w(b,c),则相应 DP 的最优决策点具有单调性。利用决策单调性,可把区间 DP 由 O(n3)O(n^3) 优化到 O(n2)O(n^2),把一类一维 DP 优化到 O(nlogn)O(n\log n)

WQS 二分

WQS 二分(带权二分 / 凸优化)用于「恰好选 kk 个某类元素」且最优值关于 kk 为凸的问题。给每个该类元素附加惩罚 λ\lambda 并去掉「恰好 kk 个」的限制求最优,再二分 λ\lambda 使最优解恰好用了 kk 个,从而把带数量限制的问题转化为一次普通求解。

例题

nn 个玩具排成一列,第 ii 个长 CiC_i。将其划分为若干连续段,每段装入一个一维容器,相邻玩具间留 11 单位间隔,则段 [i,j][i,j] 的容器长为 ji+k=ijCkj-i+\sum_{k=i}^{j}C_k,费用为该长度与 LL 之差的平方。求最小总费用。

数轴上有 nn 个村庄,要建 mm 个邮局,使每个村庄到最近邮局的距离之和最小,求该最小值。

给定 nn 个点 mm 条边的无向图,每条边为黑或白且带权,求恰好包含 kk 条白边的生成树中边权和最小的一棵。