
斜率优化DP
前言
斜率优化DP一般是形如 \(f_{i}=\min
_{j=0}^{i-1}\left\{c_j+x_{i} k_{j}\right\}+w_i\)的DP方程。
显然,我们可以使用李超线段树维护 \(y=k_i \cdot
x +f_i\)的线段,然后求 \(dp_i\)
时在第 \(x=x_i\) 求解。时间复杂度一般为
\(O(n\log n)\)。
P4655 [CEOI 2017] Building Bridges
将 \(w\) 进行前缀和,有一个显然的 \(dp\) 式子,即 \(f_i=\min_{j=1}^{i-1}\{f_j+h_i^2+h_j^2-2h_ih_j+w_{i-1}-w_j\}\)。
我们将式子进行化简即可得到 \(f_i=\min_{j=1}^{i-1}\{-2h_ih_j+f_j+h_j^2-w_j\}+h_i^2+w_{i-1}\),可以看出这是标准的斜率优化式子,我们令 \(-2h_j\) 为 \(k\) ,\(h_j^2-w_j\) 为 \(b\) ,把 \(h_i\) 当作 \(x\) ,向李超线段树中加入这些线段即可,时间复杂度 \(O(n\log n)\)。
代码:
1 |
|
P3628 [APIO2010] 特别行动队
令 \(s\) 为 \(x\) 的前缀和数组,这里直接给出推广后的式子,即 \(dp_i=\max_{j=0}^{i-1}\{-2as_is_j+dp_j+as_j^2-bs_j\}+as_i^2+bs_i+c\)。
注意此题 \(j\) 从 \(0\) 开始与上题不同,并且注意这里的 \(x\) 为 \(s\) 数组,值域达到了 \(1e8\),所以要使用动态开点。
代码:
1 |
|
P8632 [蓝桥杯 2015 国 B] 居民集会
记 \(f_{i, t}(0 \leq i \leq l, 0 \leq t \leq 4)\) 为在离起点距离为 \(i\) 处建第 \(t\) 个集合点的最小花费。特别地,我们认为 \(f_{0,0},f_{1,0},\cdots,f_{n, 0}=0\) ,答案即为 \(f_{L,4}\)。
\[ f_{i, t}=\min \left\{f_{j, t-1}+(i-j-1) \cdot s_{j+1}+(i-j-2) \cdot s_{j+2}+\cdots+(i-i) \cdot s_{i}\right\}(0 \le j \leq i) \]
变换式子,得:
\[ f_{i, t}=\min \left\{f_{i, t-1}+i \cdot\left(s_{j+1}+s_{j+2}+\cdots\right)-\left((j+1) \cdot s_{j+1}+(j+2) \cdot s_{j+2}+\cdots+i \cdot s_{i}\right)\right] \]
记 \(sum1_i=\sum_{j=0}^{i}s_j\), \(sum2_i=\sum_{j=0}^{i}s_i \cdot i\),可将继续变换为前缀和的形式:
\[ f_{i, t}=\min \left\{f_{j, t-1}+i \cdot\left(s u m 1_{i}-\operatorname{sum} 1_{j}\right)-\left(s u m 2_{i}-\operatorname{sum} 2_{j}\right)\right\} \]
去掉括号,写成斜优的标准形式如下:
\[ f_{i, t}=\min \left\{-\operatorname{sum} 1_{j} \cdot i+\operatorname{sum} 2_{j}+f_{j, t-1}\right\}+i \cdot \operatorname{sum} 1_{i}-\operatorname{sum} 2_{i} \]
此时就是很显然的斜率优化式子。
代码:
1 |
|
P2900 [USACO08MAR] Land Acquisition G
既然所有的土地都要买,那么我们可以考虑到,如果一块土地的宽和高都比另一块要小,那么肯定是直接并购,这一块对答案没有任何贡献。
我们先把这些给去掉,具体做法可以是,按高为第一关键字,宽为第二关键字从大到小排序,因为考虑当前这一个的高肯定是小于等于上一个的高,如果宽还比上一个小,则没有贡献,不用继续考虑。
于是,剩下的就是一个高度递减,宽度递增的矩形序列。考虑怎样制定它们的并购方案会最优。显然如果要并购,一定要挑序列中的一段区间,这样贡献答案的就只有最左边矩形的高乘上最右边矩形的宽,中间的又是没有贡献了。
设 \(f_{i}\)为前 \(i\) 个矩形的最小花费,直接写出一个 \(O\left(n^{2}\right)\) 的方程:
\[ f_{i}=\min _{j=0}^{i}\left\{f_{j}+l_{i} w_{j+1}\right\} \]
典型的斜率优化,代码如下:
1 |
|