核心思想
动态规划 = 把大问题拆成子问题 + 记住子问题的结果(记忆化/表格化)。关键在于找到「状态」和「状态转移方程」。
例1:爬楼梯
每次可爬 1 或 2 阶,到达第 n 阶有多少种走法?
状态:dp[i] = 到第 i 阶的方法数;转移:dp[i] = dp[i-1] + dp[i-2]
def climb(n):
if n <= 2: return n
a, b = 1, 2
for _ in range(3, n + 1):
a, b = b, a + b
return b例2:0/1 背包
def knapsack(weights, values, capacity):
dp = [0] * (capacity + 1)
for i in range(len(weights)):
for w in range(capacity, weights[i] - 1, -1):
dp[w] = max(dp[w], dp[w - weights[i]] + values[i])
return dp[capacity]