From 0b1e7287bce36f0d5563f93ae049386ce7c1d350 Mon Sep 17 00:00:00 2001 From: Sainnhe Park Date: Wed, 8 Feb 2023 12:46:24 +0800 Subject: [PATCH] Update dp --- notes/src/dynamic-programming-basic.md | 28 ++++++++++++++++++++++++-- notes/src/dynamic-programming.md | 4 ++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/notes/src/dynamic-programming-basic.md b/notes/src/dynamic-programming-basic.md index b30ec73..ccec2a6 100644 --- a/notes/src/dynamic-programming-basic.md +++ b/notes/src/dynamic-programming-basic.md @@ -7,6 +7,30 @@ 3. `dp[0] = 0`, `dp[1] = 1` 4. 从前向后遍历 -```cpp +## [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. 从前向后遍历 diff --git a/notes/src/dynamic-programming.md b/notes/src/dynamic-programming.md index 506b827..62bfa47 100644 --- a/notes/src/dynamic-programming.md +++ b/notes/src/dynamic-programming.md @@ -9,3 +9,7 @@ 3. `dp` 数组如何初始化 4. 确定遍历顺序(从前向后还是从后向前) 5. 推几个来验证 + +技巧: + +- 如果可以的话,初始化 `dp` 的长度,而不要每次都 `dp.push_back()`。初始化能够有更好的性能。