前言

单调队列优化\(DP\)应该还算是比较简单容易理解的吧,像它的升级版斜率优化\(DP\)就显得复杂了许多。

基本式子

单调队列优化\(DP\)的一般式子其实也非常简单:

\[f_i=max_{j=max(i-t,1)}^{i-1}(s(i)+g(j))\]

其中\(t\)是一个常数,\(s(i)\)是一个只与\(i\)有关的函数,\(g(j)\)是一个只与\(j\)有关的函数,式子中的\(max\)其实也可以替换成\(min\),但这里以\(max\)为例。

由于\(s(i)\)只与\(i\)有关,因此,在\(i\)不变的时候,\(s(i)\)可以看作是一个常数,因此可以将其提出,得到下面这个式子:

\[f_i=s(i)+max_{j=max(i-t,1)}^{i-1}g(j)\]

我们可以考虑用一个队列来存储合法区间,每次将区间头弹出,然后将当前元素插入队列尾。

不难发现,在队列中,如果找到两个位置\(x,y\)满足\(x<y\),则显然\(x\)将先从队列中被弹出。

那么,如果\(g(x)\le g(y)\),则不难发现,无论如何,\(x\)都不可能对后面的元素再造成贡献了,于是就可以直接将\(x\)弹出。

这样操作之后,由于队列里的元素是按编号递增的,因此元素值肯定是单调递减的。

这样一个满足单调性的队列,就是单调队列

状态转移

单调队列优化\(DP\)的状态转移其实非常简单。

通过上面的分析,显然,队列中队头的元素一定是最大/最小的,所以转移如下:

\[f_i=s(i)+g(q_H)\]

几道例题

下面是几道例题:

第一道例题: 【BZOJ2442】[USACO2011 Open] 修剪草坪

这题还是比较板子的。

第二道例题: 【洛谷3084】[USACO2013 Open] 照片

同样是一道比较简单的板子题。

第三道例题: 【BZOJ1855】[SCOI2010] 股票交易

这题就比较复杂了,需要分多种情况讨论,依然可以用单调队列来进行优化。

动态规划专题(四)——单调队列优化DP的更多相关文章

  1. [小明打联盟][斜率/单调队列 优化dp][背包]

    链接:https://ac.nowcoder.com/acm/problem/14553来源:牛客网 题目描述 小明很喜欢打游戏,现在已知一个新英雄即将推出,他同样拥有四个技能,其中三个小技能的释放时 ...

  2. BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP

    BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...

  3. 单调队列优化dp

    洛谷p3800(单调队列优化DP) 题目背景 据说在红雾异变时,博丽灵梦单身前往红魔馆,用十分强硬的手段将事件解决了. 然而当时灵梦在Power达到MAX之前,不具有“上线收点”的能力,所以她想要知道 ...

  4. 「学习笔记」单调队列优化dp

    目录 算法 例题 最大子段和 题意 思路 代码 修剪草坪 题意 思路 代码 瑰丽华尔兹 题意 思路 代码 股票交易 题意 思路 代码 算法 使用单调队列优化dp 废话 对与一些dp的转移方程,我们可以 ...

  5. 单调队列优化DP,多重背包

    单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...

  6. bzoj1855: [Scoi2010]股票交易--单调队列优化DP

    单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...

  7. hdu3401:单调队列优化dp

    第一个单调队列优化dp 写了半天,最后初始化搞错了还一直wa.. 题目大意: 炒股,总共 t 天,每天可以买入na[i]股,卖出nb[i]股,价钱分别为pa[i]和pb[i],最大同时拥有p股 且一次 ...

  8. Parade(单调队列优化dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others)    ...

  9. BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP

    BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP Description 有一排n棵树,第i棵树的高度是Di. MHY要从第一棵树到第n棵树去找他的妹子玩. 如果MHY在 ...

随机推荐

  1. uuid安装 插件安装

    yum -y install uuid uuid-devel 安装uuid包tar -zxvf uuid-1.6.1.tar.gzcd uuid-1.6.1./configuremakemake in ...

  2. Python Day23

    Django之Model操作 一.字段 字段列表 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - ...

  3. C 语言实例 - 计算一个数的 n 次方

    C 语言实例 - 计算一个数的 n 次方 计算一个数的 n 次方,例如: ,其中 为基数, 为指数. 实例 - 使用 while #include <stdio.h> int main() ...

  4. Meissel Lehmer Algorithm 求前n个数中素数个数 【模板】

    Count primes Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  5. ELK系列(5) - Logstash怎么分割字符串并添加新的字段到Elasticsearch

    问题 有时候我们想要在Logstash里对收集到的日志等信息进行分割,并且将分割后的字符作为新的字符来index到Elasticsearch里.假定需求如下: Logstash收集到的日志字段mess ...

  6. POJ1031 Fence

    题目来源:http://poj.org/problem?id=1031 题目大意: 有一个光源位于(0,0)处,一个多边形的围墙.围墙是“全黑”的,不透光也不反射光.距光源r处的光强度为I0=k/r, ...

  7. Mysql遍历大表(Mysql大量数据读取内存溢出的解决方法)

    mysql jdbc默认把select的所有结果全部取回,放到内存中,如果是要遍历很大的表,则可能把内存撑爆. 一种办法是:用limit,offset,但这样你会发现取数据的越来越慢,原因是设置了of ...

  8. POJ 2361 Tic Tac Toe

    题目:给定一个3*3的矩阵,是一个井字过三关游戏.开始为X先走,问你这个是不是一个合法的游戏.也就是,现在这种情况,能不能出现.如果有人赢了,那应该立即停止.那么可以知道X的步数和O的步数应该满足x= ...

  9. UnityError 动画系统中anystate跳转重复播放当前动画解决方案

  10. string去空格方法

    String str = " asd "; String ntr = ("A" + str).trim().substring(1);//将头部加一个字符再用t ...