DP优化 - 斜率优化
假设当前的 DP 方程为
\[f_i=\min\limits_{0\leq j< i}\{-K(i)X(j)+Y(j)\} + F(i)
\]
或
\[f_i=\max\limits_{0\leq j< i}\{-K(i)X(j)+Y(j)\} + F(i)
\]
其中 \(F(i)\)、\(K(i)\) 为关于 \(i\) 的函数,\(X(j)\)、\(Y(j)\) 为关于 \(j\) 的函数。(\(X(j)\)、\(Y(j)\) 中可以包含 \(f_j\))
接下来只考虑 \(f_i=\min\limits_{0\leq j< i}\{-K(i)X(j)+Y(j)\} + F(i)\) 的情况,因为另一个与这个相似。
此时,我们设 \(B(i)\) 为 \(f_i - F(i)\)。方程就成为
\[B(i)=\min\limits_{0\leq j< i}\{-K(i)X(j)+Y(j)\}
\]
对于一个一次方程 \(y=kx+b\),其可以转换为 \(b=y-kx\)。
所以说,原方程相当于求过所有满足 \(0\leq j < i\) 的点 \((X(j), Y(j))\) 的、斜率为 \(K(i)\) 的一次方程在 \(y\) 轴的截距 \(b\) 的最小值 \(B(i)\)。
假设有一条直线 \(y=K(i)x+b\),从 \(b=-\infty\) 开始,不断上移,直到碰到第一个碰到的点 \((X(j),Y(j))\),答案 \(B(i) = b\)。
这个问题可以使用凸包解决。
即求出所有满足 \(0\leq j < i\) 的点 \((X(j), Y(j))\) 组成的凸包,

(图片引用至 OI - WIKI)
然后求出凸包上斜率为 \(K(i)\) 的直线的切点。
只需要用一个数据结构维护两个操作:
- 在凸包中插入一个点 \((x, y)\)。
- 查询凸包中斜率为 \(k\) 的直线的切点。
这就是动态凸包问题。
浙公网安备 33010602011771号