将问题分解为重叠子问题,通过记录子问题的解避免重复计算
❓ 什么是动态规划?
动态规划是一种通过把原问题分解为相对简单的子问题来求解的方法。它将子问题的解存储起来,避免重复计算,从而提高效率。
🎯 为什么使用?
当问题具有「最优子结构」(大问题的最优解包含小问题的最优解)和「重叠子问题」(同一个子问题会被多次计算)时,DP 是最优解法。
⚙️ 如何工作?
1. 定义状态:dp[i] 代表什么含义
2. 状态转移:dp[i] 如何从 dp[i-1]、dp[i-2] 等推导
3. 初始化:边界条件 dp[0]、dp[1] 等
4. 遍历顺序:确保计算 dp[i] 时所需状态已计算
5. 返回值:根据状态定义确定答案
🎨 形象比喻
「想象爬楼梯。到达第 n 阶的方法数 = 到达第 n-1 阶的方法数 + 到达第 n-2 阶的方法数。我们把每一阶的方法数记录下来,就不需要重复计算了。」
🔍 识别关键词
当你在题目中看到以下关键词时,考虑使用动态规划:
最大最小最长最短方案数是否可能最优
📊 时间空间复杂度
时间复杂度
O(n) 或 O(n²) 取决于状态转移
空间复杂度
O(n),可优化至 O(1)
遍历所有状态,空间可以通过滚动数组优化
按?查看快捷键