动态规划 (Dynamic Programming)
1. 核心思想
将复杂问题分解为重叠子问题,通过存储子问题的解来避免重复计算。
- 最优子结构: 问题的最优解包含子问题的最优解。
- 重叠子问题: 递归过程中多次遇到相同问题。
2. 方法
- 自顶向下 (Memoization): 递归 + 备忘录。
- 自底向上 (Tabulation): 迭代 + 表格。
3. 经典问题
- 斐波那契数列 (Fibonacci)
- 0/1 背包问题 (Knapsack Problem)
- 最长公共子序列 (LCS)
- 爬楼梯 (Climbing Stairs)