Files
leetcode/notes/src/dynamic-programming-basic.md
Sainnhe Park eeacdcc5a8
All checks were successful
ci/woodpecker/push/test Pipeline was successful
Update dp
2023-02-08 15:28:22 +08:00

53 lines
2.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 基础问题
## [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. 从前向后遍历
## [70. 爬楼梯](https://leetcode.cn/problems/climbing-stairs/)
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. 从前向后遍历
## [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. 从前向后遍历
找规律