dp的优化(单队,斜率)
1.单调队列优化
维护最小值:
维护最大值:
其实原理不难,当
P2564 [SCOI2009] 生日礼物(例题)
(正片开始)在某两个城市之间有 座烽火台,每个烽火台都有一个代价。要求连续 个烽火台中至少要有一个发出信号。求总共最少的代价
设
那么为了合法,只能从
用单调队列优化,最简单的一类
和 P1725 琪露诺 很像
类似的还有最大子序和,就是拿前缀和搞(记得提前往队列里塞一个
P2627 [USACO11OPEN] Mowing the Lawn G
FJ有
计算没有连续的超过
我们可以考虑从反面下手,找出不选的奶牛,将原来的序列分割成若干长度
因此定义
如果不选,那么继承前一位的方案
如果选了,那么在
拿前缀和优化:
对于枚举的
用单调队列维护
单调队列优化多重背包
一个初学背包时的禁忌领域
先摆出多重背包的基本递推式
发现每次都是多减去一个
也就是说,
后面的部分可以考虑使用单调队列,但别着急,还有
举个例子:
考虑使用上一道题的方法,提出一个
这样队列维护的就是
wc太牛逼了
P3423 [POI2005] BAN-Bank Notes
共
设
转移:
依照上述思路:维护
一定要初始化啊啊啊啊啊啊啊
P2254 [NOI2005] 瑰丽华尔兹
描述略
第一想到理想的正方形
用两个单调队列维护两个维度
但不需要
这道题大抵是要用到
设一个方向上的时间区间长度为
则(以向右为例)
其他方向从略(向左/向上时,
维护:
那就对于每次滑动,用单调队列这个窗口在每一行/列按这个方向滑动,当然会有无效操作,但没关系,因为顺序是对的,最终答案涉及的方格总能按照正确的顺序被修改和记录,所以无所谓,搞就完了
但是:
对于区间
所以操作区间没有加一
方程:
踢队头时的区间也是
md坑害我一天
P3089 [USACO13NOV] Pogo-Cow S
有
首先,排序,方向未知,所以向左向各跑一遍
定义
先以向左为例,向右同理
那么
暴力是
肯定优化掉
我们采用单调队列的思想,既然已经按位置排了序,那么标号越小的点离
还有一个大坑:先枚举
如果不这样,其实相当于默认了起点是
观察方程,可知每次转移相当于该方案继承了上一次跳跃的起点,所以必须先锁死起点,再去枚举终点
可见,很多时候单调队列的应用就是单调性的应用,从单调性入手遍历,可以少遍历很多非法情况,有时甚至不用建队,用单调性枚举即可
P2569 [SCOI2010] 股票交易
看到
定义
分类讨论:
-
买
- 在上一次交易的基础上买进
- 白手起家(这天手头啥也没有)
-
卖
- 在上一次交易的基础上卖出
-
啥也不干
四大情况,我们来一一分析
- 在上一次交易的基础上买进
- 白手起家:相当于直接赋值
- 在上一次的基础上卖出
- 啥也不干:
)
暴力
考虑使用单调队列优化
根据经验,肯定是维护一个
此时
可见状态的定义也非常重要 (服了)
2.斜率优化
可以认为是单调队列的拓展方法
观察发现,能用单调队列维护的
那么就针对他来下手
有 个数,每次取出一段数 的花费是 , 一定,求最小花费
设
可得:
出现了麻烦项,如何处理
我们把式子这样写:
发现括号里是一个形如
对于固定的
接下来看如何单调
如果想搞单调,即从
化简得:
设
看到左边的形式想到小学的直线斜率
那么我们就以
设现在枚举到了
显然
对于
-
,那么 比 优, 比 优 -
,那么 比 优, 比 优 -
,那么 比 优, 比 优
也就是说,上凸的点一定不会是最优解,删掉上凸点后,剩下的点一定都往下凸,也就是一个下凸包,即所有线斜率单调不降
接下来,
来看看交点的特征
显然,若
那么用单调队列维护斜率,找到每个
找
注:先维护队头更答案,再维护队尾塞进
P3195 [HNOI2008] 玩具装箱
题目描述
P 教授有编号为
要求:
-
在一个一维容器中的玩具编号是连续的。
-
如果将第
件玩具到第 个玩具放到一个容器中,那么容器的长度将为 。
如果容器长度为
设
前缀和助阵
再设
按鞋油推:
设
上板子就好了
[APIO2010] 特别行动队
设
那么
再套:
设
发现这次是大于号,采用类似的方法,假设是下凸包,发现下凸点是无法成为最优解的,所以这次维护的是上凸包
上板子
P2120 [ZJOI2007] 仓库建设
设
对于
考虑处理
维护
套板子
设
搞就完了
但这题有一堆细(da)节(bian):
-
若序列中间存在
,会导致除数为零,要 极大/极小值来代替 -
中间的工厂没货的话就不可能成为仓库,仓库应该建在最后一个有货的工厂
-
末尾可能会有若干没货的工厂,要从中取一个最小值
淦
P2900 [USACO08MAR] Land Acquisition G
设长为
我们先按
套
小于号,下凸包?
发现这次的右边成为了一个负数,是单调减的,就好像是这样:
上凸包 (因为6翻了)
可见任何部分的单调性都对凸包是有影响的
还有一点就是队列内元素个数的问题,考虑到一个点就动用了
P2365 任务安排
设
看到式子里有个
化简式子
考虑搞掉
根据
方程中已知的分组就是
如图明显可得:分组后时间上多了一个
代价增加
但考虑到
其实就是相对于
所以
接下来到了激动人心的优化环节
下凸包
然后就来了个不要脸的
P5785 [SDOI2012] 任务安排ProMax
wc有负数?
也就是说:
- 弹掉对头的依据没有了
对于第一种情况,我们就不能弹掉队头了,答案也不一定是队头了,要二分查找了
物理学不存在了!(悲伤)(扭曲)(猴叫)(爬行)(蛇了)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!