# Road Map

# 动态规划

动态规划(Dynamic Programming)是一种分阶段求解策略问题的数学思想。

动态规划中包含三个重要概念:最优子结构、边界、状态转移公式。

  • 最优子结构,求解一个问题时,首先要找出问题的最优子结构;
  • 边界,边界是最简的最优子结构,无需再简化便可得到结果;如果一个问题没有边界,将无法得到有限的结果;
  • 状态转换方程,是阶段与阶段直接的转换关系

动态规划类似于高中数学的数学归纳法

# 求解过程

  1. 确定状态

    研究最优策略的最后一步,转化为子问题,定义最优子结构

  2. 转换方式

    根据子问题定义和最后一步求解过程,抽象出状态转换方程

  3. 初始条件和边界情况

    细心,考虑周全

  4. 计算顺序

    利用之前的计算结果

# 动态规划题目特点

  1. 求方案数(计数)

    • 有多少种方式走到右下角
    • 有多少种方法选出 k 个数使得和为 sum
  2. 求最值

    • 从左上角走到右下角路径的最大数字和
    • 求最长上升子序列的长度
  3. 求存在性

    • 青蛙过河,能否跳到最后一个位置
    • 取石子游戏,先手是否必胜 - 博弈论
    • 能不能选出 k 个数使得和是 sum

# DP 分类

  • 记忆化搜索
  • 背包 dp
  • 区间 dp
  • 树形 dp
  • 状压 dp
  • 数位 dp

# 其他

  • 插头 dp
  • 计数 dp