斜率优化学习笔记

斜率优化学习笔记

什么是斜率优化

首先需要知道的是斜率优化本质上就是通过对原 \(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\) 一定具有单调性了,用队列维护一下就好了。

练习题

P5785 [SDOI2012] 任务安排

P3195 [HNOI2008] 玩具装箱

P2120 [ZJOI2007] 仓库建设

P3628 [APIO2010] 特别行动队

题解请移步去:2023-2024学年上做题记录


The End

posted @ 2023-12-07 20:17  Populus_euphratica  阅读(16)  评论(0)    收藏  举报