决策单调性复习

决策单调性复习

二分栈

直接画图吧

有时候dp的决策会满足单调性,如下:(曲线代表前面的某个决策点对于x座标上的数的贡献构成的图像)

其中1234起点依次递增。现在来看1和2两条曲线,在交点前2更优,交点后1更优。因为1的起点在2之前,并且有决策单调性(斜率单增,1比2增长的越来越快),所以总有一个点使得在这之后1比2更优。而如果是下面这种:

2就永远不可能比1更优。

于是就自然的有一种想法:二分出什么时候后面比前面更优,并且搞一个单调栈来保存。

关于具体方法:先看第一张图中的1,2和4,假设现在栈中是1,2,现在处理4,可以发现4和2的交点在1和2的交点之后

那么在1和2的交点后1更优,4和2的交点前4更优,2就没用了。

有用的情况可以看1,2和3,则在2和3的交点后,1和2的交点前2是有用的。

那么我们求出当前曲线和栈里最后的曲线的交点,和栈里最后两条曲线的交点比较就行了。注意随着x的增加要弹栈。还有一个注意事项是二分的下界,出现第二种情况的时候交点应该是0。

而对于斜率单调降的函数也差不多,开个单调队列就行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章