凸壳上的单调队列:斜率优化

凸壳上的单调队列:斜率优化

一、性质:一种动态规划的优化。

二、前置: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方程可以斜率优化。这里的斜率是负数。

posted @ 2020-10-24 23:12  Little09  阅读(125)  评论(0)    收藏  举报