动态规划
动态规划(Dynamic Programming,简称DP)
00. 主要内容
- 动态规划是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题,其核心思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
01. 动态规划的基本要素
- 重叠子问题:在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。
- 最优子结构:问题的最优解由相关子问题的最优解组合而成,这些子问题可以独立求解。
- 无后效性:子问题的解一旦确定,就不再改变,不受之后阶段决策的影响。
02. 动态规划的求解步骤
- 定义状态:明确每个子问题的状态表示,通常用一个或多个变量来描述。
- 写出状态转移方程:描述子问题之间的关系,即如何通过已知子问题的解来求解更大规模的问题。
- 确定边界条件:即最简单子问题的解,通常是问题规模为1或0时的解。
- 计算顺序:按照从小到大的顺序计算子问题的解,确保在求解当前问题时,其依赖的子问题已经求解完毕。
- 优化空间:根据具体情况,可以考虑优化空间复杂度,例如使用滚动数组等方法。
03. 动态规划的应用场景
动态规划广泛应用于求解最优化问题,如:
- 背包问题:在给定容量和物品价值的背包中,如何选择物品使总价值最大。
- 最长公共子序列:求两个序列的最长公共子序列长度。
- 最短路径问题:在有向图中,求从起点到终点的最短路径。
- 资源分配问题:如何分配有限的资源,使总收益最大。
04. 动态规划与贪心算法、分治法的区别
-
与贪心算法的区别:贪心算法每一步都选择当前最优解,不考虑未来的影响,而动态规划会考虑所有子问题的最优解。
-
与分治法的区别:分治法将问题划分为独立的子问题,子问题之间没有重叠,而动态规划的子问题之间存在重叠,需要保存子问题的解以避免重复计算。

浙公网安备 33010602011771号