首页 > 其他 > 详细

单调队列理解

时间:2017-10-06 17:23:18      阅读:252      评论:0      收藏:0      [点我收藏+]

单调队列与队列唯一的不同就在于它不仅要保存元素的值,而且要保存元素的索引(下标)

简单的来说就是一个节点维护窗口大小 一个节点维护值

单调递减/递增:

首节点值映射的值是 最大的/最小的 用来控制窗口的范围  尾节点值映射的值是  最小的/最大的  用来得到答案

尾节点:在插入下标v的时候,要将队尾值映射的值和v映射的值比较,如果队尾值映射的值   不大于/不小于  v映射的值,则删除队尾的元素,然后继续将新的队尾值映射的值与v映射的值比较,直到队尾值映射的值  大于/小于  v映射的值,这个时候我们才将v插入到队尾。

首节点:当队首值小于i-k+1的时候,就说明队首对于求f(i)已经没有意义了,因为它已经不在窗里面了。所以当index[队首]<i-k+1时,将队首删除。

 

设A(x),B(x),C(x),D(x)为仅关于x的一元函数


单调队列DP


DP转移方程需要满足的条件:


dp[i]=A(i)+B(j)中的最小/大值 (i-k<=j<i,k为常数)


例子:

dp[i]=dp[j]+(i-j)*w // 选自hdu3401
A(i)=i*w
B(j)=dp[j]-j*w


分析:

维护B(j)的最大合法值进行转移即可

单调队列理解

原文:http://www.cnblogs.com/Aragaki/p/7631770.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!