动态规划总结目录

动态规划总结目录

I. 综述

动态规划,常常用以解决最优化或是计数问题。

动态规划更像分治思想,但是又有所不同。它将问题中几个关键的量抽离来代表一个子问题,这是建模(而这些量就是状态)。显然,这些子问题有一个已知答案的边界问题。然后按照一定的顺序遍历状态空间(由“子问题”构成的空间),从以前的子问题的结果推导出后面的子问题,这就称作“转移”

这也就是说,动态规划对子问题的遍历有一些顺序。比如要通过x子问题推导到y子问题,就要求x要先于y计算,之后,x子问题不能再被以后的子问题更新,就例如如果x转移到y,那么y不能再转移到x,这就是“无后效性”。按照这种顺序,我们可以把可以一起计算、相互之间不发生转移的几个问题划分在一起,这就叫“阶段”。我们决定从哪个子问题推出这个子问题的最优解,这个叫做“决策”

但是,如果你很难将问题拆分为几个可以从前向后导出的子问题,无法保证由某几个子问题的最优解可以导出后面问题的最优解,或者说子问题的“重叠”很少,不具有可重复的求解过程,那么动态规划就不能使用或者无法提供优化。这两个性质,前者就是“最优子结构性质”,后者就是“子问题重叠性质”

以上,我们谈到了动态规划的三个适用条件和三要素:

  • 阶段、状态、决策

  • 无后效性、最优子结构性质、子问题重叠性质

这些挺抽象的,反正作为一个蒟蒻,我初学的时候是不懂。不过现在我们可以为他画个图。

如图所示,DP的转移构成有向无环图,若A是初态,G是终态。

那么DP的阶段,就是按照拓扑排序分出的层。以上每一个点都是子问题(含有状态,也许还是多维的),每一条箭头都是合法的决策。无后效性,就是说这张图里不存在环。

因为这样的特性,所以动态规划和最短路问题有着较为密切的联系,而我们完全可以把动态规划的递推过程放置在SPFA算法上运行,这在后文中有所涉及。

而且,也因为这样的特性,树形动态规划常常都跟其根的选择有关系,稍后读者也会看到。

II. 索引

  1. 线性DP

  2. 背包DP

    • 0/1背包

    • 完全背包

    • 多重背包

    • 分组背包

  3. 区间DP

  4. 树形DP

    • 二次扫描与换根法

    • 有依赖的树形背包

  5. 计数DP

  6. 数位DP

  1. 状态压缩DP

  2. 倍增优化DP

    • 基于计算优化
  3. 数据结构优化DP

  4. 单调队列优化DP

    • 单调队列优化多重背包
posted @   haozexu  阅读(7)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示