-------回溯算法:
适用类型:排列,组合,子集
套路思想:做选择,撤销选择,从而把所有可能列出来。
代码套路:
result = []
def backtrack(路径, 选择列表):
if 满足结束条件:
result.add(路径)
return
for 选择 in 选择列表:
做选择
backtrack(路径, 选择列表)
撤销选择
-----动态规划:
适用类型: 求最值,
套路思想: 求解动态规划的核心问题是穷举。
1、列出正确的「状态转移方程」,正确地穷举。
2、需要判断算法问题是否具备「最优子结构」,是否能够通过子问题的最值得到原问题的最值。
3、存在「重叠子问题」,需要使用「备忘录」或者「DP table」来优化穷举过程
代码套路:
明确「状态」-> 明确「选择」 -> 定义 dp 数组/函数的含义。
动态规划一般是自底向上,脱离了递归,而是由循环迭代完成计算。
自顶向下递归的动态规划
def dp(状态1, 状态2, ...):
for 选择 in 所有可能的选择:
# 此时的状态已经因为做了选择而改变
result = 求最值(result, dp(状态1, 状态2, ...))
return result
自底向上迭代的动态规划
初始化 base case
dp[0][0][...] = base case
进行状态转移
for 状态1 in 状态1的所有取值:
for 状态2 in 状态2的所有取值:
for ...
dp[状态1][状态2][...] = 求最值(选择1,选择2...)