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\) 的直线的切点。

这就是动态凸包问题。

posted on 2023-02-14 17:38  Evan_song  阅读(9)  评论(0)    收藏  举报