slope trick 小记
学习的过程比较艰辛,搞了半天才搞明白,所以记录一下。
适用范围
优化形如 \(f_{i,j}=|x_i-j|+\min f_{i-1,k}\) 的 DP 转移。
原理
由于绝对值函数是连续,下凸的一次函数,因此几个绝对值函数相加仍然满足这一特点,即归纳证明将 DP 式子的第二维当做横坐标后,每个 \(f_i\) 的图像也满足这一特点。我们考虑存储每次斜率 \(+1\) 的横坐标,从而快速转移 DP。
解题方法
首先尝试列出朴素的 \(n^2\) DP式子,如最开始的例子。然后考虑 \(k\) 的取值范围。假设每次转移中 \(k\) 的取值范围是 \([l_i,r_i]\),则整个函数有以下变化:
最低点右边的部分全部向右平移 \(r_i-l_i\),最低点的范围增加 \(r_i-l_i\)。
在 \(x_i\) 这个点,斜率增加了 \(2\),即维护的点集需要增加两个 \(x_i\)。
若当前 \(x_i\) 在最低点左边,则左边下降的部分的最后一段变成上升的,反之亦然。
由这 \(3\) 条关键信息,我们可以用堆来维护点集。比较好的例子是 CF1534G,感觉是整个过程最完整的一道题。