动态规划总结目录
动态规划总结目录
I. 综述
动态规划,常常用以解决最优化或是计数问题。
动态规划更像分治思想,但是又有所不同。它将问题中几个关键的量抽离来代表一个子问题,这是建模(而这些量就是状态)。显然,这些子问题有一个已知答案的边界问题。然后按照一定的顺序遍历状态空间(由“子问题”构成的空间),从以前的子问题的结果推导出后面的子问题,这就称作“转移”。
这也就是说,动态规划对子问题的遍历有一些顺序。比如要通过x子问题推导到y子问题,就要求x要先于y计算,之后,x子问题不能再被以后的子问题更新,就例如如果x转移到y,那么y不能再转移到x,这就是“无后效性”。按照这种顺序,我们可以把可以一起计算、相互之间不发生转移的几个问题划分在一起,这就叫“阶段”。我们决定从哪个子问题推出这个子问题的最优解,这个叫做“决策”。
但是,如果你很难将问题拆分为几个可以从前向后导出的子问题,无法保证由某几个子问题的最优解可以导出后面问题的最优解,或者说子问题的“重叠”很少,不具有可重复的求解过程,那么动态规划就不能使用或者无法提供优化。这两个性质,前者就是“最优子结构性质”,后者就是“子问题重叠性质”。
以上,我们谈到了动态规划的三个适用条件和三要素:
-
阶段、状态、决策
-
无后效性、最优子结构性质、子问题重叠性质
这些挺抽象的,反正作为一个蒟蒻,我初学的时候是不懂。不过现在我们可以为他画个图。
如图所示,DP的转移构成有向无环图,若A是初态,G是终态。
那么DP的阶段,就是按照拓扑排序分出的层。以上每一个点都是子问题(含有状态,也许还是多维的),每一条箭头都是合法的决策。无后效性,就是说这张图里不存在环。
因为这样的特性,所以动态规划和最短路问题有着较为密切的联系,而我们完全可以把动态规划的递推过程放置在SPFA算法上运行,这在后文中有所涉及。
而且,也因为这样的特性,树形动态规划常常都跟其根的选择有关系,稍后读者也会看到。
II. 索引
-
线性DP
-
背包DP
-
0/1背包
-
完全背包
-
多重背包
-
分组背包
-
-
区间DP
-
树形DP
-
二次扫描与换根法
-
有依赖的树形背包
-
-
计数DP
-
数位DP
-
- 基于状态优化
-
状态压缩DP
-
倍增优化DP
- 基于计算优化
-
数据结构优化DP
-
单调队列优化DP
- 单调队列优化多重背包
-
环形与后效性处理
本文来自博客园,作者:haozexu,转载请注明原文链接:https://www.cnblogs.com/haozexu/p/18281769
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix