DP基本原理:
问题的最优解可以由子问题的最优解推导得到,通过先求解子问题的最优解,在构造原问题的最优解
DP设计步骤:
- 把原始问题划分成一系列子问题;
- 求解每个子问题仅一次,并保存到一个表中,后续使用的时候直接可以读取;
- 自底向上地计算;
DP三要素:
最优子结构、边界、状态转移函数
以走楼梯问题为例:有十个台阶,从上往下走,一次只能走一个或两个台阶,请问总共有多少种走法?
最优子结构:我们来考虑要走到第十个台阶的最后一步,最后一步必须走到第八或者第九。
边界:f(1) = 1, f(2) = 2
状态转移:f(n) = f(n-1) + f(n-2)
解法一:递归
def get_count(n):
if n == 1:
return 1
elif n == 2:
return 2
else:
return get_count(n-1) + get_count(n-2)
print(get_count(10))
解法二:备忘录法
def get_count(n):
if n == 1:
return 1
elif n == 2:
return 2
else:
memo = [1, 2]
for i in range(3, n):
memo[0], memo[1] = memo[1], memo[0] + memo[1]
return memo[0] + memo[1]