【动态规划10】单调队列总结

来源:互联网 发布:淘宝客全店推广如何做 编辑:程序博客网 时间:2024/06/05 21:15

https://wenku.baidu.com/view/ef259400bed5b9f3f90f1c3a.html

先丢一个感觉超好用论文。
在之前我也写过两道用单调队列优化DP的题解,今天偶然看到了这样一个论文,大概就题目与用法之间写一个总结。
单调队列就是维护一个队列,满足队列里的元素的值与指针都是单调的。

一、维护区间的最大值/最小值

假设这个数列为a[],区间的大小为m。
假如维护最大值那么就维护一个单调递减队列,每次向右找到一个新的位置i时,假如队尾的元素比a[i]小的话,就将队尾元素出队,直到满足递减性便将a[i]入队。同时对于队首,假如它的指针小于i-m+1,那么显然这个数字对于我们所求的区间是无关的,也将它出队。
结束之后,此时显然队首的元素就是所求区间中的最大值,因为这个队列是单调递减的。
对于最小值亦然。

那么,为什么这样子维护队列,就能找到区间的最大值/最小值呢?
对于最大值,我们思考这么一个问题,我们所求的最大值的区间是从i-m+1~i,那我们假设目前的队尾元素是a[j],而且a[j]<a[j+1],那么对于j+1之后区间而言,这些区间必然如果包含j那么一定包含j+1,然而a[j+1]>a[j],对于求最大值而言,显然a[j]相当于不存在了。

http://blog.csdn.net/flanoc/article/details/72860395

不要脸地丢个自己写的(代码超丑的)题解。
维护区间最大值和最小值然后瞎搞就行。

二、同时维护多种单调性

其实也没说的那么玄乎,大概就是a[][2],在a[][0]相同时,优先考虑a[][1]的大小。
还是不要脸地扔个题解。

http://blog.csdn.net/flanoc/article/details/72870236

论文中的题目
http://blog.csdn.net/Flanoc/article/details/72918520
待续

原创粉丝点击