码迷,mamicode.com
首页 > 其他好文 > 详细

单调队列理解

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

标签:说明   大于   比较   删除   索引   target   index   nbsp   需要   

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

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

单调递减/递增:

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

尾节点:在插入下标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)的最大合法值进行转移即可

单调队列理解

标签:说明   大于   比较   删除   索引   target   index   nbsp   需要   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!