在单调队列优化中,形如 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优,原假设不成立,所以,队列中就可以以斜率来保存最右,保证做出的是一个下凸的形状(斜率逐渐增加(或者说尽可能的取更大的斜率))
具体的实现还不是很懂。。,回头做一些题再回来把坑填上。。。。。。