凸壳上的单调队列:斜率优化
凸壳上的单调队列:斜率优化
一、性质:一种动态规划的优化。
二、前置:dp、单调队列。
三、适用:\(dp[i]=a[i]*b[j]+c[i]+d[j]\)。\(a[i]\)单调递增。
四、方法:
移项:\(-a[i]b[j]+dp[i]-a[i]=d[j]\),把\(b[j]\)看作\(x\),把\(d[j]\)看作\(y\),把\(-a[i]\)看作\(k\):\(kx+dp[i]-a[i]=y\)。此直线过\((x,y)\)且斜率已知为\(k\),要求截距最小。维护一个下凸壳。对于每个\(i\),要求的是第一个满足\(slope(P_j,P_{j+1})>k\)的。单调队列维护即可。
五、步骤:
设队首\(head\)队尾\(tail\)。
1、对于队首:\(while(slope(P_{head},P_{head+1})<k) head++\)
2、队首为最优,计算\(dp[i]\)
3、队尾:\(while(slope(P_{tail-1},P_{tail})>slope(P_{tail-1},P_{i})) tail--\)
4、在队尾加入\(P_i\)
六、例题
[HNOI2008]玩具装箱 模板题。
摆渡车 列出dp方程后展开直接优化。
丝之割 先把弦转为为二维平面上的点,去掉无用状态后发现dp方程可以斜率优化。这里的斜率是负数。