动态规划

动态规划(Dynamic Programming,简称DP)


00. 主要内容

  • 动态规划是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题,其核心思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

01. 动态规划的基本要素

  1. 重叠子问题:在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。
  2. 最优子结构:问题的最优解由相关子问题的最优解组合而成,这些子问题可以独立求解。
  3. 无后效性:子问题的解一旦确定,就不再改变,不受之后阶段决策的影响。

02. 动态规划的求解步骤

  1. 定义状态:明确每个子问题的状态表示,通常用一个或多个变量来描述。
  2. 写出状态转移方程:描述子问题之间的关系,即如何通过已知子问题的解来求解更大规模的问题。
  3. 确定边界条件:即最简单子问题的解,通常是问题规模为1或0时的解。
  4. 计算顺序:按照从小到大的顺序计算子问题的解,确保在求解当前问题时,其依赖的子问题已经求解完毕。
  5. 优化空间:根据具体情况,可以考虑优化空间复杂度,例如使用滚动数组等方法。

03. 动态规划的应用场景

动态规划广泛应用于求解最优化问题,如:

  • 背包问题:在给定容量和物品价值的背包中,如何选择物品使总价值最大。
  • 最长公共子序列:求两个序列的最长公共子序列长度。
  • 最短路径问题:在有向图中,求从起点到终点的最短路径。
  • 资源分配问题:如何分配有限的资源,使总收益最大。

04. 动态规划与贪心算法、分治法的区别

  • 与贪心算法的区别:贪心算法每一步都选择当前最优解,不考虑未来的影响,而动态规划会考虑所有子问题的最优解。

  • 与分治法的区别:分治法将问题划分为独立的子问题,子问题之间没有重叠,而动态规划的子问题之间存在重叠,需要保存子问题的解以避免重复计算。


总之,动态规划是一种强大的算法设计技术,能够高效地解决许多具有重叠子问题和最优子结构性质的问题。

掌握动态规划的关键在于理解问题的本质,正确地定义状态和状态转移方程。

posted @ 2025-07-20 12:07  nebula_walk  阅读(95)  评论(0)    收藏  举报