斜率优化学习笔记

斜率优化:

1.算法用途:用于优化一些DP形如的式子:

f[j]-f[k]<kx+b

2.算法步骤:(例题:HDU\left ( 3507 \right )链接

1.推出DP方程式:f[i]=min(f[j]+(sum[i]-sum[j-1])^{2}+M)(j<i)

2.设在求Fi时从Fj转移比从Fk转移更优

3.写出一个不等式f[j]+(sum[i]-sum[j-1])^{2}+M<f[k]+(sum[i]-sum[k-1])^{2}+M

4.拆开移项合并同类项:f[j]-f[k]<2sum[i](sum[j-1]-sum[k-1])+sum[k-1]^{2}-sum[j-1]^{2}(形如kx+b

5.继续变形变成:(f[j]-f[k]+sum[j-1]^2-sum[k-1]^2)/(2*(sum[j-1]-sum[k-1]))<sum[i]

6.设xi=f[i]+sum[i-1]^2yi=sum[i-1]*2

7.则原式可以写成:(xj-xk)/(yj-yk)=sum[i]

8.因为sum[i]呈单调性,所以j的转移一定比k优(见下图)

 

9.这其实是下凹凸包(链接1:大佬博客)(链接2:百度百科

10.所以可以用一个单调队列,过程如下:

11.一直往下,直到解比队尾更优

12.所以开始的时候直接从队头开始进行DP

 

小结:

1.要先想出DP方程式

2.写出不等式

3.根据题意化简变为斜率优化的样子

posted @ 2019-08-03 15:40  CodeHelper  阅读(170)  评论(0编辑  收藏  举报