From eeacdcc5a88fe4e86ec22d6cbb7b564ea3dfa79c Mon Sep 17 00:00:00 2001 From: Sainnhe Park Date: Wed, 8 Feb 2023 15:28:22 +0800 Subject: [PATCH] Update dp --- notes/src/dynamic-programming-basic.md | 16 ++++++++++++++++ notes/src/dynamic-programming.md | 1 + 2 files changed, 17 insertions(+) diff --git a/notes/src/dynamic-programming-basic.md b/notes/src/dynamic-programming-basic.md index ccec2a6..d09e892 100644 --- a/notes/src/dynamic-programming-basic.md +++ b/notes/src/dynamic-programming-basic.md @@ -34,3 +34,19 @@ 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. 从前向后遍历 + +找规律 diff --git a/notes/src/dynamic-programming.md b/notes/src/dynamic-programming.md index 62bfa47..fe2d1f4 100644 --- a/notes/src/dynamic-programming.md +++ b/notes/src/dynamic-programming.md @@ -13,3 +13,4 @@ 技巧: - 如果可以的话,初始化 `dp` 的长度,而不要每次都 `dp.push_back()`。初始化能够有更好的性能。 +- 知道用 DP ,也知道 `dp[i]` 应该用来表示什么,但不知道递推关系。这个时候多举几个简单的例子找规律(s0096)。