leetcode/notes/src/dynamic-programming-basic.md

2.0 KiB
Raw Blame History

基础问题

509. 斐波那契数

  1. dp[i] 是第 i 个斐波那契数的数值
  2. dp[i] = dp[i - 1] + dp[i - 2]
  3. dp[0] = 0, dp[1] = 1
  4. 从前向后遍历

70. 爬楼梯

  1. dp[i] 是爬到第 i 阶楼梯的方法数
  2. dp[i] = dp[i - 1] + dp[i - 2]
  3. dp[1] = 1, dp[2] = 2, dp[0] 不用管
  4. 从前向后遍历

746. 使用最小花费爬楼梯

  1. dp[i] 是爬到第 i 阶的最小开销(假设 i == 0 代表第一个阶梯)
  2. dp[i] = min{dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]}
  3. dp[0] = 0, dp[1] = 0
  4. 从前向后遍历

62. 不同路径

  1. dp[i][j] 表示到 (i, j) 的位置有多少种路径(从 (0, 0) 出发)
  2. dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
  3. dp[i][0] = 1, dp[0][j] = 1
  4. 从前向后遍历

63. 不同路径 II

  1. dp[i][j] 表示到 (i, j) 的位置有多少种路径(从 (0, 0) 出发)
  2. dp[i][j] = if (isNotObstacle[i - 1][j]) dp[i - 1][j] + if (isNotObstacle[i][j - 1]) dp[i][j - 1]
  3. 如果 (i, 0) 是障碍物,那么 (0, 0)(i - 1, 0) 都初始化为 1,后面的初始化为 0(0, j) 同理
  4. 从前向后遍历

343. 整数拆分

  1. dp[i] 为分拆数字 i,可以得到的最大乘积
  2. dp[i] = max{dp[i], (i - j) * j, dp[i - j] * j}
  3. dp[2] = 1
  4. 从前向后遍历

96. 不同的二叉搜索树

  1. dp[i]n == i 时二叉搜索树的个数
  2. dp[i] += dp[j - 1] * dp[i - j]j - 1j 为头结点左子树节点数量,i - j 为以 j 为头结点右子树节点数量
  3. dp[0] = 1 空节点也是一棵二叉树,也是一棵二叉搜索树
  4. 从前向后遍历

找规律