斜率优化动态规划

例题:HNOI2008 玩具装箱

状态转移方程 clip_image002

clip_image004clip_image006

clip_image008

设此时有决策a和b,其中a≤b

若决策a优于决策b,则

clip_image010

分离变量,移项整理

clip_image012

 

clip_image014

那么就意味着clip_image016时决策a比决策b优

因为对于每个i来说,clip_image018是常量,所以clip_image016[1]是判断决策优劣程度的充要标准。

那么现在考虑决策a,b,c,其中a≤b≤c

clip_image020那么有什么结论呢?

分情况讨论,因为clip_image022clip_image018[1]比较可以判定决策的优劣,所以分三种情况:

clip_image024

这意味着a比b优,b又比c优,所以a最优,应该选a,不能选b。

clip_image026

这意味着b比a优,c又比b优,所以c最优,应该选c,不能选b。

clip_image028

这意味着a比b优,c也比b优,所以不是a最优就是c最优,反正b不是最优,还是不能选b。

综上所述,如果clip_image020[1],那么b一定不能选,所以就不用考虑b了。

那么就维护一个单调队列:

1、对于队尾:设a,b,c(a≤b≤c)是队尾的三个元素,那么判断clip_image030clip_image032,若clip_image020[2],就把c向前一位,也就是覆盖掉b。如此循环判断直到clip_image034或元素少于三个。

2、对于队头:设a,b(a≤b)是队头的两个元素,因为clip_image016[2]clip_image018[2]是单调的(如果不单调那只能用平衡树维护了),所以clip_image036 那么就是说a对于以后的任意一个状态都不是最优决策,所以a出队。

通过以上两种维护,每次转移i时选队头就是最优决策了。

复杂度从O(n2)降到了O(n)。

你可能感兴趣的:(动态规划)