(长期更新)DP 优化 学习笔记
- 空间优化
- 时间优化
- 状态方面的优化
- 转移方面的优化
- 快速寻找决策点
- 批量转移
- 从一批状态转移来
- 转移到一批状态
纯粹的空间优化
滚动数组 & 类似滚动数组的
本质:某个时刻,某些状态现在和以后都不会再被用到了,于是让新的状态覆盖掉这些状态。
滚动数组常用取模(特殊的:奇偶)来实现。
时间优化 & 时间和空间一起优化的(综合优化)
单调队列优化 DP
作用:去除多余点 来 快速寻找决策点。
状态转移方程:
- 可能还有 只与
有关的数值、其他只与 有关的数值 和 常数 参与运算。总之这些都是定值( 走过了, 就成定值了)。 和 同理,这里以 为例。 和 都随 增大而不降(这里假定是 到 ,且 )。
发现
前面的点显然会比后面的先出队,那么如果后面的点已经进队了且比前面的点优,这个前面的点就永远不会作为决策点了,于是直接让它出队即可。发现这样的过程形成了一个从前往后单调递增的队列,它就是单调队列。出队的过程其实就是在队尾踢点直到踢不动。队头的点即是决策点。
在线。
斜率优化 DP
作用:去除多余点 来 快速寻找决策点。
单调队列优化 DP 无法处理
状态转移方程:
和 同理。
下面两个方向都是在线(上面方程里和
有两个方向:
1. 李超线段树(维护直线)
应用范围更广,但速度稍慢。
去 min 推式子。
把与
应用范围更广,但修改 2 只 log,查询 1 只 log。
可以放到树上,李超线段树合并。
2. 队列(维护凸壳)
速度较快,但限制更多。
一些细节可能搞忘了,哪天复习来补。
把与
相当于拿一根已知斜率的直线去过每个点,看截距的最小值。那么只需要从下往上移动这个直线,看第一个过的点是哪个。
[斜率 单增 / 单减 时,可以用单调队列来维护凸壳。斜率单增且取
[斜率没有单调性的时候也可能可以,只要点的横坐标有单调性就可以用队列维护凸壳,找决策点时在凸壳上二分。也要注意思考是上凸壳还是下凸壳。](?)
[实现细节上,队列要保证一定有一个点在里面。](?)
[要注意开始的时候那个位置
还有关于精度、[
听 xjy 说推出来的式子可以不止一种,只要斜率单调即可。
单调队列优化 DP、斜率优化 DP 的观察技巧
- 拆式子,变成能进行这两种优化的形式。
- [换 维度枚举顺序。](?)
2024.?.?
2024.10.23
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】