一般形式:求最值
    核心问题:穷举
    三要素:

    1. 重叠子问题:使用备忘录/DP table优化
    2. 最优子结构:通过子问题的最值得到原问题的最值
    3. 状态转移方程

    明确 base case -> 明确「状态」-> 明确「选择」 -> 定义 dp 数组/函数的含义

    1. # 初始化 base case
    2. dp[0][0][...] = base
    3. # 进行状态转移
    4. for 状态1 in 状态1的所有取值:
    5. for 状态2 in 状态2的所有取值:
    6. for ...
    7. dp[状态1][状态2][...] = 求最值(选择1,选择2...)
    • 自顶向下:带备忘录的递归解法
    • 自底向上:动态规划(迭代)

    状态压缩
    每次状态转移只需要 DP table 中的一部分,那么可以尝试用状态压缩来缩小 DP table 的大小