斜率优化dp学习笔记
斜率优化dp,主要用于转移式子长这样,或者可以经过一定的变形变成这样的式子:
由$$f_i = f_j + ……$$
变化到$$b = y - kx$$
其中\(b\)只与\(i\)有关,\(y\)只与\(j\)有关,\(kx\)是一个二次项,其中\(k\)只与\(i\)有关,\(x\)只与\(j\)有关。
这里以求最小值为例,即\(f_i = \min\{f_j + ……\}\),我们注意到这个式子变形之后非常类似一个一次函数,于是我们考虑使用数形结合。
注意到此时\(x\)、\(y\)、\(k\)均已知,则原问题转化为,在平面直角坐标系中,给定i个点的坐标(因为存在0),和一条直线的斜率,要求直线必须过至少一个点,求直线在y轴上的最小截距。
对于任意一个点\(i\),它的最优决策点必然在下凸包上。
证明
首先对于一个点\(i\),如果它不在下凸包上,则一定会有\((y_i - y_{i-1}) / (x_i - x_{i-1}) > (y_{i+1} - y_i) / (x_{i+1} - x_i)\),因为下凸包斜率必须单调递增。
然后我们要证伪的命题是:存在一个斜率\(k\),使得在\(i\)点比在\(i-1\)和\(i+1\)都更优。
\(i\)比\(i-1\)更优,则有\(y_i - k*x_i < y_{i-1} - k * x_{i - 1}\),可得\(k > (y_i - y_{i - 1}) / (x_i - x_{i - 1})\)
\(i\)比\(i+1\)更优,则有\(y_i - k * x_i < y_{i+1} - k * x_{i+1}\),可得\(k < (y_{i+1} - y_i) / (x_{i+1} - x_i)\)
但\(k\)不可能同时大于大的,小于小的,所以不存在这样的\(k\),证完。
接下来分三种情况讨论:
1.\(x\)和\(k\)均单调:
用一个单调队列维护凸包,同时注意到,由于k单调不降,所以凸包上的最优决策点一定不会左移。
直接单调队列即可,复杂度\(o(n)\)。
2.\(x\)单调,\(k\)不单调:
依然可以用单调队列维护凸包,但求k的时候要在单调队列上进行二分,复杂度\(O(nlog_n)\)
3.\(x\)和\(k\)都不单调:
三种选择:cdq,斜优,李超线段树。笔者只会第一种。
cdq分治的基本思想依然不变:先处理左区间,再处理左区间对右区间贡献,最后处理右区间。
所以可以维护两个数组,分别按x和k排序,递归的时候不断拆分成左右两个区间,再归并即可。中间照常用单调队列做,复杂度\(o(nlog_n)\)
完结撒花!