数据结构优化dp
滚动数组
在dp时经常会发现只有相邻阶段间状态才会有直接联系,在转移方程中的体现形如:只有前
用这种方法可以将dp某一维干掉,把
值域树状数组/平衡树优化dp
考虑dp方程
可以将
前缀和优化
略
单调队列
当你发现题目的转移满足这种形式时
也就是滑动窗口,使用单调队列是最好的选择
有些题目的转移式写出来可能不是这个形式,但是通过移项拆分,将相同变量的放到一起,可以凑出这种形式,具体可以参考后面标上单调队列建模标签的题目
ybtoj 金牌导航 递增子序列 (值域树状数组)
题目
给定
题解
首先将数字离散化,然后进行dp
设
然后你发现你要求的是值域上的一段区间,所以考虑使用树状数组优化即可
P2605 [ZJOI2010]基站选址 (线段树)
题目
有
题解
设
其中
由于
这个题妙的地方来了,这里单独计算
具体来说,我们通过二分找出第
时间复杂度
BZOJ3688 折线统计 (值域树状数组)
题解
先将点按照横坐标大小排序
设
转移如下
然后值域树状数组优化就做完了
时间复杂度
P6089 [JSOI2015]非诚勿扰 (与极限有关的推导和树状数组求逆序对)
题目
一共有
每个客人都有一个选书列表,对于每一本书,他有
如果他拒绝这本书,他就会去看下一本书,如果他不选最后一本书,则他又会从第一本书开始选书,直到他找到一本适合自己的书。
当然,两个客人可能选到同一本书。
在考虑任意两个不同的客人
店主希望求出不稳定因素的期望数目。
题解
考虑一个人在它的列表中选第1本书的概率。假设他的列表长度为
即
然后可以推出
最后值域树状数组求逆序对即可
时间复杂度
P7302 [NOI1998] 免费的馅饼 (排序+值域树状数组)
题解
设
转移方程为
其中
对绝对值分类讨论
第一个条件排序干掉,第二个条件离散化后使用值域树状数组优化,这样就可以保证同时满足两个条件
时间复杂度为
P3287 [SCOI2014]方伯伯的玉米田 (二维树状数组)
题目
方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美。这排玉米一共有
题解
拔高玉米有一个显然的贪心策略:每次拔的区间都形如
然后既然我们要拔高
设
然后我们发现这东西有三维限制,我们先
时间复杂度
P2467 [SDOI2010]地精部落 (滚动数组+前缀和)
题目
给
题解
这种排列的题都可以往求错排数的方向上想一想
设
考虑转移,末尾可以再填一个
滚动数组滚掉第一位维,前缀和优化第二维即可
时间复杂度
ybtoj 金牌导航 最大连续和 (单调队列)
题目
给定一个长度为
题解
设
首先使用前缀和优化掉求和,我们把前缀和存在
那么后面的那个
时间复杂度
ybtoj 金牌导航 修剪草坪 (单调队列)
题目
有一个长度为
题解
设
单调队列优化即可
时间复杂度
ybtoj 金牌导航 旅行问题 (单调队列建模)
题目
John 打算驾驶一辆汽车周游一个环形公路。公路上总共有
判断以每个车站为起点能否按条件成功周游一周。
题解
先破环成链,链的长度为
对汽车油量和距离分别做前缀和
这个东西是很难维护的,所以我们可以尝试对汽车油量与距离之差做前缀和,记为
算出
逆时针同理,时间复杂度
单调队列优化多重背包 (单调队列建模)
题目
我们现在有
题解
通过01背包的状态,我们很容易写出这个问题一般的转移方程
dp[i][j]=max(dp[i-1][j],dp[i-1][j-v]+w,dp[i-1][j-2*v]+2*w,.....,dp[i-1][j-s*v]+s*w)
滚动数组优化下变成
dp[j]=max(dp[j],dp[j-v]+w,dp[j-2*v]+2*w,.....,dp[j-s*v]+s*w)
由此我们发现
dp[j]=dp[j]
dp[j+v]=max(dp[j]+w,dp[j+v])
dp[j+2v]=max(dp[j]+2w,dp[j+v]+w,dp[j+2v])
dp[j+3v]=max(dp[j]+3w,dp[j+v]+2w,dp[j+2v]+w,dp[j+3v])
.....
对它进行一个变形
dp[j]=dp[j]
dp[j+v]=max(dp[j],dp[j+v]-w)+w
dp[j+2v]=max(dp[j],dp[j+v]-w,dp[j+2v]-2w)+2w
dp[j+3v]=max(dp[j],dp[j+v]-w,dp[j+2v]-2w,dp[j+3v]-3w)+3w
......
这样变形的意义在于,我们将原先不规则的、难以维护的东西转换成了规则的,好维护的东西。换句话说,我们要知道
时间复杂度
P2254 [NOI2005] 瑰丽华尔兹
题目
给定一个
题解
设
直接暴力转移的复杂度是
思考一下这个东西是怎么转移的,我们发现这个转移是关于最值的,而且只关系到某一行/列,是线性的,这时候就不妨向单调队列的方向想一想
注意到对于当前时间段
所以我们就可以使用单调队列优化干掉一维,时间复杂度
P2216 [HAOI2007]理想的正方形
题目
有一个
题解
利用单调队列,将原来
时间复杂度
P2569 [SCOI2010]股票交易 (单调队列建模)
题目
你初始时有无限的钱,并且每天持有的股票不超过
题解
设
状态转移方程如下
买入:
卖出:
复杂度是
同样的套路,将具有相同变量的东西放在一起
我们将
时间复杂度
posted on 2023-07-24 19:58 star_road_xyz 阅读(67) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效