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

53 lines
2.0 KiB
Markdown
Raw Normal View History

2023-02-08 04:20:15 +00:00
# 基础问题
## [509. 斐波那契数](https://leetcode.cn/problems/fibonacci-number/)
1. `dp[i]` 是第 `i` 个斐波那契数的数值
2. `dp[i] = dp[i - 1] + dp[i - 2]`
3. `dp[0] = 0`, `dp[1] = 1`
4. 从前向后遍历
2023-02-08 04:46:24 +00:00
## [70. 爬楼梯](https://leetcode.cn/problems/climbing-stairs/)
2023-02-08 04:20:15 +00:00
2023-02-08 04:46:24 +00:00
1. `dp[i]` 是爬到第 `i` 阶楼梯的方法数
2. `dp[i] = dp[i - 1] + dp[i - 2]`
3. `dp[1] = 1`, `dp[2] = 2`, `dp[0]` 不用管
4. 从前向后遍历
## [746. 使用最小花费爬楼梯](https://leetcode.cn/problems/min-cost-climbing-stairs/)
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. 不同路径](https://leetcode.cn/problems/unique-paths/)
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](https://leetcode.cn/problems/unique-paths-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. 从前向后遍历
2023-02-08 07:28:22 +00:00
## [343. 整数拆分](https://leetcode.cn/problems/integer-break/)
1. `dp[i]` 为分拆数字 `i`,可以得到的最大乘积
2. `dp[i] = max{dp[i], (i - j) * j, dp[i - j] * j}`
3. `dp[2] = 1`
4. 从前向后遍历
## [96. 不同的二叉搜索树](https://leetcode.cn/problems/unique-binary-search-trees/)
1. `dp[i]``n == i` 时二叉搜索树的个数
2. `dp[i] += dp[j - 1] * dp[i - j]``j - 1` 为 `j` 为头结点左子树节点数量,`i - j` 为以 `j` 为头结点右子树节点数量
3. `dp[0] = 1` 空节点也是一棵二叉树,也是一棵二叉搜索树
4. 从前向后遍历
找规律