斜率优化dp

来源:互联网 发布:倚天象棋软件 编辑:程序博客网 时间:2024/06/05 12:03

在单调队列优化中,形如  dp[i]=max/min(f[k])+g[i]     (k<i  g[i]k无关) 的转移式可以进行单调队列优化

但有的时候会出现dp[i]=dp[j]+(x[i]-x[j])^2的形式,化开后会出先x[i]*x[j]的项,就无法使用单调队列进行优化

此时,我们令(k<j<i)

得到dp[i]=dp[k]+(x[i]-x[k])^2和dp[i]=dp[j]+(x[i]-x[j])^2两个式子

若k的情况比j更优,则可以得到

dp[k]+(x[i]-x[k])^2<dp[j]+(x[i]-x[j])^2    (或>,具体根据题目

可转化为

(dp[k]+x[k]^2-dp[j]-x[j]^2)/(x[k]-x[j])<2x[i];

令f[n]=dp[n]+x[k]^2,g[n]=x[k]-x[j] 上式即可视为(f[k]-f[j])/(g[k]-g[j])<2x[i]

左边就可以当成一个斜率式来看,在进行单调队列维护时,就可以以斜率来进行优劣的判断


重点:如何来维护最优解

另(k<j<i),假设j到i比k到i优,  如果斜率(k,i)小于斜率(j,i),易证成立。反之,如果斜率斜率(k,i)大于斜率(j,i)

——————

|                     |         (假装有图)图片太大了不知道怎么缩小

|                     |

|                     |

——————

由图易得选k将会比比选j优,原假设不成立,所以,队列中就可以以斜率来保存最右,保证做出的是一个下凸的形状(斜率逐渐增加(或者说尽可能的取更大的斜率))



具体的实现还不是很懂。。,回头做一些题再回来把坑填上。。。。。。