斜率优化 学习笔记
适用范围
斜率优化适用于转移方程中有 $i,j$ 相关的相乘的量出现。
原理
决策单调性,可参考单调队列优化。
操作方法
正确地写出状态转移方程式。
令当前状态为 $i$,则“任取 $i>j>k>0$ 中的 $j$ 和 $k$”,分别写出转移方程式。
将二者相减,得到通过 $j$ 转移比通过 $i$ 转移更优所需满足的不等式组。
将 $i$ 有关的视作主元,分开一次项与常数项。
得到斜率。
根据斜率单调性维护单调队列(同普通单调队列优化)
以此题为例:
$$f_i=min,{,f_j+w_{j+1}×l_i,}(0≤j<i)$$
$$f_i=min,{,f_j+w_{j+1}×l_i,}(0≤j<i)$$
$$f_i=min,{,f_k+w_{k+1}×l_i,}(0≤k<j)$$
3~5.
$$ f_j-f_k\le (w_{k+1}-w_{j+1})×l_i$$
$$\text{即斜率为} \frac{f_j-f_k}{w_{k+1}-w_{j+1}}$$
1
2
3
4
5
6for(int i=1;i<=n;++i) {
while(l<r&&slope(q[l],q[l+1])<=a[i].y) ++l;
f[i]=f[q[l]]+a[q[l]+1].x*a[i].y;
while(l<r&&slope(q[r-1],q[r])>=slope(q[r],i)) --r;
q[++r]=i;
}