斜率优化学习笔记
斜率优化学习笔记
什么是斜率优化
首先需要知道的是斜率优化本质上就是通过对原 \(dp\) 式子的化简,通过其他方法维护使得原 \(dp\) 式的时间复杂度降低的方法。
斜率优化是怎么做的
假如现在有一个 \(dp\) 转移方程如下:
\[f_i = \min\left \{ f_j + (s_i - s_j) ^ 2 \right \}(j < i)
\]
如果直接进行的转移的话,时间复杂度则是 \(O(n ^ 2)\) 的,显然对于数据范围较大的数是过不了的,所以这时候就需要化简式子。
假设 \(s\) 数组单调递增 (这是普通斜率优化的一个条件,如果不满足这个条件,则需要用 \(CDQ\) 或者二分进行维护)。
再假设 \(j < k\) 且从 \(k\) 贡献比从\(j\) 贡献更优。
那么化简开始:
\[f_j + (s_i - s_j) ^ 2 > f_k + (s_i - s_k) ^ 2\\
f_j + s_i ^ 2 + s_j ^ 2 - 2s_is_j > f_k + s_i ^ 2 + s_k ^ 2 - 2s_is_k\\
2s_i(s_k - s_j) > f_k - f_j + s_i ^ 2 - s_i ^ 2 + s_k ^ 2 - s_j ^ 2\\
\because s_k > s_j\\
\therefore s_k - s_j > 0 \\
\therefore 2s_i > \frac{f_k - f_j + s_k ^ 2 - s_j ^ 2}{s_k - s_j}
\]
最后这个式子就是说如果满足这个条件,那么 \(k\) 对 \(i\) 的贡献比 \(j\) 优。
现在考虑怎么维护上面那个东西。
首先可以发现\(f\) 一定具有单调性了,用队列维护一下就好了。
练习题
题解请移步去:2023-2024学年上做题记录
The End

浙公网安备 33010602011771号