动态规划(Dynamic Programming)详解
动态规划(Dynamic Programming)详解
目录
- 动态规划简介
- 动态规划核心思想
- 动态规划问题的基本要素
- 动态规划应用步骤
- 经典动态规划问题解析
- 动态规划优化技巧
- 实际应用案例
- 动态规划的优缺点
- 总结与学习资源
1. 动态规划简介
动态规划(Dynamic Programming, DP) 是一种解决复杂问题的算法设计范式,通过将原问题分解为相对简单的子问题,并利用子问题之间的关系,避免重复计算,最终高效求解全局最优子结构问题。
- 核心目标:以空间换时间,降低时间复杂度(通常从指数级降至多项式级)。
- 适用场景:最优化问题、计数问题、存在重叠子问题和最优子结构的问题(如背包问题、路径规划、编辑距离等)。
2. 动态规划核心思想
2.1 三大关键特性
-
最优子结构(Optimal Substructure)
问题的最优解包含其子问题的最优解。
示例:最短路径中,若路径A→B→C是A到C的最短路径,则A→B和B→C也必须是各自段的最短路径。 -
重叠子问题(Overlapping Subproblems)
子问题会被重复计算多次,通过记忆化(缓存中间结果)减少冗余计算。 -
无后效性(Markov Property)
当前状态仅与之前状态有关,与后续决策无关。
2.2 与分治法、贪心算法的区别
方法 | 子问题独立性 | 重复计算 | 最优性保证 |
---|---|---|---|
分治法 | 子问题独立 | 可能重复 | 不保证 |
贪心算法 | 自顶向下选择 | 无 | 局部最优 |
动态规划 | 依赖子问题 | 避免重复 | 全局最优 |
3. 动态规划问题的基本要素
3.1 状态定义(State)
- 用
dp[i][j]
或dp[i]
表示问题的某个中间状态。 - 示例:在背包问题中,
dp[i][w]
表示前i
个物品在容量w
下的最大价值。
3.2 状态转移方程(State Transition Equation)
- 描述状态之间的递推关系,是动态规划的核心公式。
- 示例:斐波那契数列的
dp[i] = dp[i-1] + dp[i-2]
。
3.3 边界条件(Base Case)
- 初始化最小子问题的解。
- 示例:斐波那契数列中
dp[0] = 0, dp[1] = 1
。
4. 动态规划应用步骤
- 问题分析
- 确认问题是否满足最优子结构和重叠子问题特性。
- 定义状态