算法题2

43 阅读1分钟

-------回溯算法:

适用类型:排列,组合,子集

套路思想:做选择,撤销选择,从而把所有可能列出来。

代码套路:

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...)