From 325f88571fd4a6ac2d96fd0450f1b3326364c83d Mon Sep 17 00:00:00 2001 From: ITCharge Date: 2023年9月20日 14:22:09 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20Latex=20=E8=AF=AD?= =?UTF-8?q?=E5=8F=A5=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../02.Algorithm-Complexity.md | 2 +- .../01.Binary-Tree/01.Binary-Tree-Basic.md | 2 +- .../01.Binary-Indexed-Tree.md | 2 +- .../02.Knapsack-Problem-02.md | 18 ++++++++--------- .../03.Knapsack-Problem-03.md | 6 +++--- .../04.Knapsack-Problem-04.md | 20 +++++++++---------- .../05.Knapsack-Problem-05.md | 10 +++++----- .../05.Interval-DP/01.Interval-DP.md | 4 ++-- .../07.State-DP/01.State-DP.md | 6 +++--- .../08.Counting-DP/01.Counting-DP.md | 6 +++--- ...15345円220円214円350円267円257円345円276円204円.md" | 6 +++--- ...345244円215円345円205円203円347円264円240円 II.md" | 2 +- ...50345円271円263円346円226円271円346円225円260円.md" | 4 ++-- ...36345円255円220円345円272円217円345円210円227円.md" | 2 +- .... 346円210円263円346円260円224円347円220円203円.md" | 2 +- .../0342. 4347円232円204円345円271円202円.md" | 14 ++++++------- ...11345円222円214円345円255円220円351円233円206円.md" | 2 +- ...16347円232円204円346円216円222円345円210円227円.md" | 6 +++--- ...21347円232円204円347円233円264円345円276円204円.md" | 2 +- ...01344円273円275円346円225円260円351円207円217円.md" | 2 +- ...27347円232円204円351円225円277円345円272円246円.md" | 2 +- ...347232円204円351円207円215円351円207円217円 II.md" | 2 +- ...06351円205円215円346円246円202円347円216円207円.md" | 4 ++-- ...02346円210円226円346円223円215円344円275円234円.md" | 2 +- ...26345円200円274円344円271円213円345円222円214円.md" | 6 +++--- ...06347円232円204円346円225円260円347円233円256円.md" | 2 +- ...51347円232円204円344円270円252円346円225円260円.md" | 2 +- ...00345円260円217円347円232円204円346円225円260円.md" | 4 ++-- ...43345円245円221円346円225円260円345円210円227円.md" | 2 +- 29 files changed, 72 insertions(+), 72 deletions(-) diff --git a/Contents/00.Introduction/02.Algorithm-Complexity.md b/Contents/00.Introduction/02.Algorithm-Complexity.md index 6207db1d..c86132e7 100644 --- a/Contents/00.Introduction/02.Algorithm-Complexity.md +++ b/Contents/00.Introduction/02.Algorithm-Complexity.md @@ -185,7 +185,7 @@ def algorithm(n): return cnt ``` -上述代码中 `cnt = 1` 的时间复杂度为 $O(1)$ 可以忽略不算。`while` 循环体中 $cnt$ 从 1ドル$ 开始,每循环一次都乘以 2ドル$。当大于等于 $n$ 时循环结束。变量 $cnt$ 的取值是一个等比数列:2ドル^0,2^1,2^2,...,2^x,ドル根据 2ドル^x = n,ドル可以得出这段循环体的执行次数为 $\log_2n,ドル所以这段代码的时间复杂度为 $O(\log_2n)$。 +上述代码中 `cnt = 1` 的时间复杂度为 $O(1)$ 可以忽略不算。`while` 循环体中 $cnt$ 从 1ドル$ 开始,每循环一次都乘以 2ドル$。当大于等于 $n$ 时循环结束。变量 $cnt$ 的取值是一个等比数列:2ドル^0, 2^1, 2^2, ..., 2^x,ドル根据 2ドル^x = n,ドル可以得出这段循环体的执行次数为 $\log_2n,ドル所以这段代码的时间复杂度为 $O(\log_2n)$。 因为 $\log n = k \times \log_2 n,ドル这里 $k = 3.322,ドル所以,$\log n$ 与 $\log_2 n$ 的差别比较小。为了方便书写,通常我们将对数时间复杂度写作是 $O(\log n)$。 diff --git a/Contents/07.Tree/01.Binary-Tree/01.Binary-Tree-Basic.md b/Contents/07.Tree/01.Binary-Tree/01.Binary-Tree-Basic.md index d835a012..df1710de 100644 --- a/Contents/07.Tree/01.Binary-Tree/01.Binary-Tree-Basic.md +++ b/Contents/07.Tree/01.Binary-Tree/01.Binary-Tree-Basic.md @@ -15,7 +15,7 @@ - 包括根节点在内,每个节点可以有多个后继节点。 - 当 $n> 1$ 时,除了根节点之外的其他节点,可分为 $m(m> 0)$ 个互不相交的有限集合 $T_1, T_2, ..., T_m,ドル其中每一个集合本身又是一棵树,并且被称为根的 **「子树(SubTree)」**。 -如下图所示,红色节点 $A$ 是根节点,除了根节点之外,还有 `3` 棵互不相交的子树 $T_1(B、E、H、I、G)$、$T_2(C)$、$T_3(D、F、G、K)$。 +如下图所示,红色节点 $A$ 是根节点,除了根节点之外,还有 `3` 棵互不相交的子树 $T_1(B, E, H, I, G)$、$T_2(C)$、$T_3(D, F, G, K)$。 ![](https://qcdn.itcharge.cn/images/20220218104556.png) diff --git a/Contents/07.Tree/04.Binary-Indexed-Tree/01.Binary-Indexed-Tree.md b/Contents/07.Tree/04.Binary-Indexed-Tree/01.Binary-Indexed-Tree.md index c3c716a8..fa4ae282 100644 --- a/Contents/07.Tree/04.Binary-Indexed-Tree/01.Binary-Indexed-Tree.md +++ b/Contents/07.Tree/04.Binary-Indexed-Tree/01.Binary-Indexed-Tree.md @@ -2,7 +2,7 @@ ### 1.1 树状数组的定义 -> **树状数组(Binary Indexed Tree)**:也因其发明者命名为 Fenwick 树,最早由 Peter M. Fenwick 于 1994 年以 A New Data Structure for Cumulative Frequency Tables 为题发表在 SOFTWARE PRACTICE AND EXPERIENCE。其初衷是解决数据压缩里的累积频率(Cumulative Frequency)的计算问题,现多用于高效计算数列的前缀和, 区间和。它可以以 $O(\log ⁡n)$ 的时间得到任意前缀 $\sum_{i=1}^{j} A[i], 1 \le j \le N,ドル并同时支持在 $O(\log ⁡n)$ 时间内支持动态单点值的修改。空间复杂度为 $O(n)$。 +> **树状数组(Binary Indexed Tree)**:也因其发明者命名为 Fenwick 树,最早 Peter M. Fenwick 于 1994 年以 A New Data Structure for Cumulative Frequency Tables 为题发表在 SOFTWARE PRACTICE AND EXPERIENCE。其初衷是解决数据压缩里的累积频率(Cumulative Frequency)的计算问题,现多用于高效计算数列的前缀和,区间和。它可以以 $O(\log n)$ 的时间得到任意前缀 $\sum_{i=1}^{j}A[i], 1 \le j \le n,ドル并同时支持在 $O(\log n)$ 时间内支持动态单点值的修改。空间复杂度为 $O(n)$。 ### 1.2 树状数组的原理 diff --git a/Contents/10.Dynamic-Programming/04.Knapsack-Problem/02.Knapsack-Problem-02.md b/Contents/10.Dynamic-Programming/04.Knapsack-Problem/02.Knapsack-Problem-02.md index cafdbc65..625a0f97 100644 --- a/Contents/10.Dynamic-Programming/04.Knapsack-Problem/02.Knapsack-Problem-02.md +++ b/Contents/10.Dynamic-Programming/04.Knapsack-Problem/02.Knapsack-Problem-02.md @@ -36,12 +36,12 @@ 则状态转移方程为: -$dp[i][w] = max \lbrace dp[i - 1][w - k \times weight[i - 1]] + k \times value[i - 1] \rbrace,\quad 0 \le k \times weight[i - 1] \le w$。 +$dp[i][w] = max \lbrace dp[i - 1][w - k \times weight[i - 1]] + k \times value[i - 1] \rbrace, \quad 0 \le k \times weight[i - 1] \le w$。 ###### 4. 初始条件 -- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0] = 0,0 \le i \le size$。 -- 无论背包载重上限是多少,前 0ドル$ 种物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w] = 0,0 \le w \le W$。 +- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0] = 0, 0 \le i \le size$。 +- 无论背包载重上限是多少,前 0ドル$ 种物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w] = 0, 0 \le w \le W$。 ###### 5. 最终结果 @@ -81,15 +81,15 @@ class Solution: 我们将之前的状态转移方程 -$dp[i][w] = max \lbrace dp[i - 1][w - k \times weight[i - 1]] + k \times value[i - 1] \rbrace,\quad 0 \le k \times weight[i - 1] \le w$ +$dp[i][w] = max \lbrace dp[i - 1][w - k \times weight[i - 1]] + k \times value[i - 1] \rbrace, \quad 0 \le k \times weight[i - 1] \le w$ 进行展开: -$(1) \quad dp[i][w] = max \begin{cases} dp[i - 1][w] \cr dp[i - 1][w - weight[i - 1]] + value[i - 1] \cr dp[i - 1][w - 2 \times weight[i - 1]] + 2 \times value[i - 1] \cr ...... \cr \cr dp[i - 1][w - k \times weight[i - 1]] + k \times value[i - 1] \end{cases},\quad 0 \le k \times weight[i - 1] \le w$ +$(1) \quad dp[i][w] = max \begin{cases} dp[i - 1][w] \cr dp[i - 1][w - weight[i - 1]] + value[i - 1] \cr dp[i - 1][w - 2 \times weight[i - 1]] + 2 \times value[i - 1] \cr ...... \cr \cr dp[i - 1][w - k \times weight[i - 1]] + k \times value[i - 1] \end{cases}, \quad 0 \le k \times weight[i - 1] \le w$ 而对于 $dp[i][w - weight[i - 1]]$ 我们有: -$(2) \quad dp[i][w - weight[i - 1]] = max \begin{cases} dp[i - 1][w - weight[i - 1]] \cr dp[i - 1][w - 2 \times weight[i - 1]] + value[i - 1] \cr dp[i - 1][w - 3 \times weight[i - 1]] + 2 \times value[i - 1] \cr ...... \cr dp[i - 1][w - k \times weight[i - 1]] + (k - 1) \times value[i - 1] \end{cases},\quad weight[i - 1] \le k \times weight[i - 1] \le w$ +$(2) \quad dp[i][w - weight[i - 1]] = max \begin{cases} dp[i - 1][w - weight[i - 1]] \cr dp[i - 1][w - 2 \times weight[i - 1]] + value[i - 1] \cr dp[i - 1][w - 3 \times weight[i - 1]] + 2 \times value[i - 1] \cr ...... \cr dp[i - 1][w - k \times weight[i - 1]] + (k - 1) \times value[i - 1] \end{cases}, \quad weight[i - 1] \le k \times weight[i - 1] \le w$ 通过观察可以发现: @@ -133,8 +133,8 @@ $\quad dp[i][w] = \begin{cases} dp[i - 1][w] & w < weight[i - 1] \cr max \lbrac ###### 4. 初始条件 -- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0] = 0,0 \le i \le size$。 -- 无论背包载重上限是多少,前 0ドル$ 种物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w] = 0,0 \le w \le W$。 +- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0] = 0, 0 \le i \le size$。 +- 无论背包载重上限是多少,前 0ドル$ 种物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w] = 0, 0 \le w \le W$。 ###### 5. 最终结果 @@ -201,7 +201,7 @@ $dp[w] = \begin{cases} dp[w] & w < weight[i - 1] \cr max \lbrace dp[w], \quad d ###### 4. 初始条件 -- 无论背包载重上限为多少,只要不选择物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[w] = 0,0 \le w \le W$。 +- 无论背包载重上限为多少,只要不选择物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[w] = 0, 0 \le w \le W$。 ###### 5. 最终结果 diff --git a/Contents/10.Dynamic-Programming/04.Knapsack-Problem/03.Knapsack-Problem-03.md b/Contents/10.Dynamic-Programming/04.Knapsack-Problem/03.Knapsack-Problem-03.md index 8b31b9a8..879ea89e 100644 --- a/Contents/10.Dynamic-Programming/04.Knapsack-Problem/03.Knapsack-Problem-03.md +++ b/Contents/10.Dynamic-Programming/04.Knapsack-Problem/03.Knapsack-Problem-03.md @@ -26,8 +26,8 @@ $dp[i][w] = max \lbrace dp[i - 1][w - k \times weight[i - 1]] + k \times value[i ###### 4. 初始条件 -- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0] = 0,0 \le i \le size$。 -- 无论背包载重上限是多少,前 0ドル$ 种物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w] = 0,0 \le w \le W$。 +- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0] = 0, 0 \le i \le size$。 +- 无论背包载重上限是多少,前 0ドル$ 种物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w] = 0, 0 \le w \le W$。 ###### 5. 最终结果 @@ -121,7 +121,7 @@ class Solution: 但我们还是可以从物品数量入手,通过「二进制优化」的方式,将算法的时间复杂度降低。 -> **二进制优化**:简单来说,就是把物品的数量 $count[i]$ 拆分成「由 1ドル、2、4、...、2^m$ 件单个物品组成的大物品」,以及「剩余不足 2ドル$ 的整数次幂数量的物品,由 $count[i] -2^{\lfloor \log_2(count[i] + 1) \rfloor - 1}$ 件单个物品组成大物品」。 +> **二进制优化**:简单来说,就是把物品的数量 $count[i]$ 拆分成「由 1,ドル 2, 4, ..., 2^m$ 件单个物品组成的大物品」,以及「剩余不足 2ドル$ 的整数次幂数量的物品,由 $count[i] -2^{\lfloor \log_2(count[i] + 1) \rfloor - 1}$ 件单个物品组成大物品」。 举个例子,第 $i$ 件物品的数量为 31ドル,ドル采用「二进制优化」的方式,可以拆分成 31ドル = 1 + 2 + 4 + 8 + 16$ 一共 5ドル$ 件物品。也将是将 31ドル$ 件物品分成了 5ドル$ 件大物品: diff --git a/Contents/10.Dynamic-Programming/04.Knapsack-Problem/04.Knapsack-Problem-04.md b/Contents/10.Dynamic-Programming/04.Knapsack-Problem/04.Knapsack-Problem-04.md index 5b255e95..1647d715 100644 --- a/Contents/10.Dynamic-Programming/04.Knapsack-Problem/04.Knapsack-Problem-04.md +++ b/Contents/10.Dynamic-Programming/04.Knapsack-Problem/04.Knapsack-Problem-04.md @@ -112,12 +112,12 @@ class Solution: 则状态转移方程为: -$dp[i][w] = max \lbrace dp[i - 1][w],dp[i - 1][w - weight[i - 1][k]] + value[i - 1][k] \rbrace , \quad 0 \le k \le group\underline{}count[i - 1]$ +$dp[i][w] = max \lbrace dp[i - 1][w], dp[i - 1][w - weight[i - 1][k]] + value[i - 1][k] \rbrace , \quad 0 \le k \le group\underline{}count[i - 1]$ ###### 4. 初始条件 -- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0] = 0,0 \le i \le size$。 -- 无论背包载重上限是多少,前 0ドル$ 组物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w] = 0,0 \le w \le W$。 +- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0] = 0, 0 \le i \le size$。 +- 无论背包载重上限是多少,前 0ドル$ 组物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w] = 0, 0 \le w \le W$。 ###### 5. 最终结果 @@ -163,11 +163,11 @@ class Solution: ###### 3. 状态转移方程 -$dp[w] = max \lbrace dp[w], \quad dp[w - weight[i - 1][k]] + value[i - 1][k] \rbrace ,\quad 0 \le k \le group\underline{}count[i - 1]$ +$dp[w] = max \lbrace dp[w], \quad dp[w - weight[i - 1][k]] + value[i - 1][k] \rbrace , \quad 0 \le k \le group\underline{}count[i - 1]$ ###### 4. 初始条件 -- 无论背包载重上限为多少,只要不选择物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[w] = 0,0 \le w \le W$。 +- 无论背包载重上限为多少,只要不选择物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[w] = 0, 0 \le w \le W$。 ###### 5. 最终结果 @@ -229,11 +229,11 @@ $dp[i][w][v] = max(dp[i - 1][w][v], dp[i - 1][w - weight[i - 1]][v - volume[i - ###### 4. 初始条件 - 如果背包载重上限为 0ドル$ 或者容量上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即: - - $dp[i][w][0] = 0,0 \le i \le size,0 \le w \le W$ - - $dp[i][0][v] = 0,0 \le i \le size,0 \le v \le V$ + - $dp[i][w][0] = 0, 0 \le i \le size, 0 \le w \le W$ + - $dp[i][0][v] = 0, 0 \le i \le size, 0 \le v \le V$ - 无论背包载重上限是多少,前 0ドル$ 种物品所能获得的最大价值一定为 0ドル,ドル即: - - $dp[0][w][v] = 0,0 \le w \le W,0 \le v \le V$ + - $dp[0][w][v] = 0, 0 \le w \le W, 0 \le v \le V$ ###### 5. 最终结果 @@ -290,8 +290,8 @@ $dp[w][v] = max \lbrace dp[w][v], \quad dp[w - weight[i - 1]][v - volume[i - 1]] ###### 4. 初始条件 - 如果背包载重上限为 0ドル$ 或者容量上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即: - - $dp[w][0] = 0,0 \le w \le W$ - - $dp[0][v] = 0,0 \le v \le V$ + - $dp[w][0] = 0, 0 \le w \le W$ + - $dp[0][v] = 0, 0 \le v \le V$ ###### 5. 最终结果 diff --git a/Contents/10.Dynamic-Programming/04.Knapsack-Problem/05.Knapsack-Problem-05.md b/Contents/10.Dynamic-Programming/04.Knapsack-Problem/05.Knapsack-Problem-05.md index f88c41bc..e04dea6a 100644 --- a/Contents/10.Dynamic-Programming/04.Knapsack-Problem/05.Knapsack-Problem-05.md +++ b/Contents/10.Dynamic-Programming/04.Knapsack-Problem/05.Knapsack-Problem-05.md @@ -6,18 +6,18 @@ 在背包问题中,有的题目不要求把背包装满,而有的题目要求恰好装满背包。 -如果题目要求「恰好装满背包」,则我们可在原有状态定义、状态转移方程的基础上,在初始化时,令 $dp[0] = 0,ドル以及 $d[w] = -\infty,1 \le w \le W$。 这样就可以保证最终得到的 $dp[W]$ 为恰好装满背包的最大价值总和。 +如果题目要求「恰好装满背包」,则我们可在原有状态定义、状态转移方程的基础上,在初始化时,令 $dp[0] = 0,ドル以及 $d[w] = -\infty, 1 \le w \le W$。 这样就可以保证最终得到的 $dp[W]$ 为恰好装满背包的最大价值总和。 这是因为:初始化的 $dp$ 数组实际上就是在没有任何物品可以放入背包时的「合法状态」。 如果不要求恰好装满背包,那么: -1. 任何载重上限下的背包,在不放入任何物品时,都有一个合法解,此时背包所含物品的最大价值为 0ドル,ドル即 $dp[w] = 0,0 \le w \le W$。 +1. 任何载重上限下的背包,在不放入任何物品时,都有一个合法解,此时背包所含物品的最大价值为 0ドル,ドル即 $dp[w] = 0, 0 \le w \le W$。 而如果要求恰好装满背包,那么: 1. 只有载重上限为 0ドル$ 的背包,在不放入物品时,能够恰好装满背包(有合法解),此时背包所含物品的最大价值为 0ドル,ドル即 $dp[0] = 0$。 -2. 其他载重上限下的背包,在放入物品的时,都不能恰好装满背包(都没有合法解),此时背包所含物品的最大价值属于未定义状态,值应为 $-\infty,ドル即 $dp[w] = 0,0 \le w \le W$。 +2. 其他载重上限下的背包,在放入物品的时,都不能恰好装满背包(都没有合法解),此时背包所含物品的最大价值属于未定义状态,值应为 $-\infty,ドル即 $dp[w] = 0, 0 \le w \le W$。 这样在进行状态转移时,我们可以通过判断 $dp[w]$ 与 $-\infty$ 的关系,来判断是否能恰好装满背包。 @@ -32,7 +32,7 @@ 3. **状态转移方程**:$dp[w] = dp[w] + dp[w - weight[i - 1]]$ 4. **初始条件**: 1. 只有载重上限为 0ドル$ 的背包,在不放入物品时,能够恰好装满背包(有合法解),此时背包所含物品的最大价值为 0ドル,ドル即 $dp[0] = 0$。 - 2. 其他载重上限下的背包,在放入物品的时,都不能恰好装满背包(都没有合法解),此时背包所含物品的最大价值属于未定义状态,值应为 $-\infty,ドル即 $dp[w] = 0,0 \le w \le W$。 + 2. 其他载重上限下的背包,在放入物品的时,都不能恰好装满背包(都没有合法解),此时背包所含物品的最大价值属于未定义状态,值应为 $-\infty,ドル即 $dp[w] = 0, 0 \le w \le W$。 5. **最终结果**:根据我们之前定义的状态, $dp[w]$ 表示为:将物品装入最多能装重量为 $w$ 的背包中的方案总数。则最终结果为 $dp[W],ドル其中 $W$ 为背包的载重上限。 #### 思路 1:代码 @@ -192,7 +192,7 @@ class Solution: > **0-1 背包问题求具体方案**:有 $n$ 种物品和一个最多能装重量为 $W$ 的背包,第 $i$ 种物品的重量为 $weight[i],ドル价值为 $value[i],ドル每件物品有且只有 1ドル$ 件。请问将哪些物品装入背包,可使这些物品的总重量不超过背包载重上限,且价值总和最大? -#### 思路 4:动态规划 + 路径记录 +#### 4:动态规划 + 路径记录 0-1 背包问题的状态转移方程为:$dp[i][w] = max \lbrace dp[i - 1][w], \quad dp[i - 1][w - weight[i - 1]] + value[i - 1] \rbrace$ diff --git a/Contents/10.Dynamic-Programming/05.Interval-DP/01.Interval-DP.md b/Contents/10.Dynamic-Programming/05.Interval-DP/01.Interval-DP.md index cf88cf41..2cf479c7 100644 --- a/Contents/10.Dynamic-Programming/05.Interval-DP/01.Interval-DP.md +++ b/Contents/10.Dynamic-Programming/05.Interval-DP/01.Interval-DP.md @@ -40,7 +40,7 @@ for i in range(size - 1, -1, -1): # 枚举区间起点 #### 1.2.3 第 2 种区间 DP 问题基本思路 -多个(大于等于 2ドル$ 个)小区间转移到大区间的区间 DP 问题的状态转移方程一般为:$dp[i][j] = max / min \lbrace dp[i][k] + dp[k + 1][j] + cost[i][j] \rbrace,\quad i < k \le j$。 +多个(大于等于 2ドル$ 个)小区间转移到大区间的区间 DP 问题的状态转移方程一般为:$dp[i][j] = max / min \lbrace dp[i][k] + dp[k + 1][j] + cost[i][j] \rbrace, \quad i < k \le j$。 1. 其中状态 $dp[i][j]$ 表示为:区间 $[i, j]$ (即下标位置 $i$ 到下标位置 $j$ 上所有元素)上的最大价值。 2. $cost[i][j]$ 表示为:将两个区间 $[i, k]$ 与 $[k + 1, j]$ 中的元素合并为区间 $[i, j]$ 中的元素的代价。 @@ -232,7 +232,7 @@ $dp[i][j] = max \lbrace dp[i][k] + dp[k][j] + nums[i] \times nums[k] \times nums ###### 4. 初始条件 -- $dp[i][j]$ 表示的是开区间,则 $i < j - 1$。而当 $i \ge j - 1$ 时,所能获得的硬币数为 0ドル,ドル即 $dp[i][j] = 0,\quad i \ge j - 1$。 +- $dp[i][j]$ 表示的是开区间,则 $i < j - 1$。而当 $i \ge j - 1$ 时,所能获得的硬币数为 0ドル,ドル即 $dp[i][j] = 0, \quad i \ge j - 1$。 ###### 5. 最终结果 diff --git a/Contents/10.Dynamic-Programming/07.State-DP/01.State-DP.md b/Contents/10.Dynamic-Programming/07.State-DP/01.State-DP.md index a3dd8ac8..b5eaad57 100644 --- a/Contents/10.Dynamic-Programming/07.State-DP/01.State-DP.md +++ b/Contents/10.Dynamic-Programming/07.State-DP/01.State-DP.md @@ -154,8 +154,8 @@ 举个例子: -1. $nums2 = \lbrace 1, 2, 3, 4 \rbrace,state = (1001)_2,ドル表示选择了第 1ドル$ 个元素和第 4ドル$ 个元素,也就是 1ドル$、4ドル$。 -2. $nums2 = \lbrace 1, 2, 3, 4, 5, 6 \rbrace,state = (011010)_2,ドル表示选择了第 2ドル$ 个元素、第 4ドル$ 个元素、第 5ドル$ 个元素,也就是 2ドル$、4ドル$、5ドル$。 +1. $nums2 = \lbrace 1, 2, 3, 4 \rbrace, state = (1001)_2,ドル表示选择了第 1ドル$ 个元素和第 4ドル$ 个元素,也就是 1ドル$、4ドル$。 +2. $nums2 = \lbrace 1, 2, 3, 4, 5, 6 \rbrace, state = (011010)_2,ドル表示选择了第 2ドル$ 个元素、第 4ドル$ 个元素、第 5ドル$ 个元素,也就是 2ドル$、4ドル$、5ドル$。 这样,我们就可以通过动态规划的方式来解决这道题。 @@ -173,7 +173,7 @@ 对于当前状态 $dp[state],ドル肯定是从比 $state$ 少选一个元素的状态中递推而来。我们可以枚举少选一个元素的状态,找到可以组成的异或值之和最小值,赋值给 $dp[state]$。 -举个例子 $nums2 = \lbrace 1, 2, 3, 4 \rbrace,state = (1001)_2,ドル表示选择了第 1ドル$ 个元素和第 4ドル$ 个元素,也就是 1ドル$、4ドル$。那么 $state$ 只能从 $(1000)_2$ 和 $(0001)_2$ 这两个状态转移而来,我们只需要枚举这两种状态,并求出转移过来的异或值之和最小值。 +举个例子 $nums2 = \lbrace 1, 2, 3, 4 \rbrace,ドル$state = (1001)_2,ドル表示选择了第 1ドル$ 个元素和第 4ドル$ 个元素,也就是 1ドル$、4ドル$。那么 $state$ 只能从 $(1000)_2$ 和 $(0001)_2$ 这两个状态转移而来,我们只需要枚举这两种状态,并求出转移过来的异或值之和最小值。 即状态转移方程为:$dp[state] = min(dp[state], \quad dp[state \oplus (1 \text{ <}\text{< } i)] + (nums1[i] \oplus nums2[one\underline{}cnt - 1])),ドル其中 $state$ 第 $i$ 位一定为 1ドル,ドル$one\underline{}cnt$ 为 $state$ 中 1ドル$ 的个数。 diff --git a/Contents/10.Dynamic-Programming/08.Counting-DP/01.Counting-DP.md b/Contents/10.Dynamic-Programming/08.Counting-DP/01.Counting-DP.md index ffaff133..50744e22 100644 --- a/Contents/10.Dynamic-Programming/08.Counting-DP/01.Counting-DP.md +++ b/Contents/10.Dynamic-Programming/08.Counting-DP/01.Counting-DP.md @@ -82,7 +82,7 @@ ###### 3. 状态转移方程 -因为我们每次只能向右、或者向下移动一步,因此想要走到 $(i, j),ドル只能从 $(i - 1, j)$ 向下走一步走过来;或者从 $(i, j - 1)$ 向右走一步走过来。所以可以写出状态转移方程为:$dp[i][j] = dp[i - 1][j] + dp[i][j - 1],ドル此时 $i> 0,j> 0$。 +因为我们每次只能向右、或者向下移动一步,因此想要走到 $(i, j),ドル只能从 $(i - 1, j)$ 向下走一步走过来;或者从 $(i, j - 1)$ 向右走一步走过来。所以可以写出状态转移方程为:$dp[i][j] = dp[i - 1][j] + dp[i][j - 1],ドル此时 $i> 0, j> 0$。 ###### 4. 初始条件 @@ -115,8 +115,8 @@ class Solution: ##### 思路 1:复杂度分析 -- **时间复杂度**:$O(m * n)$。初始条件赋值的时间复杂度为 $O(m + n),ドル两重循环遍历的时间复杂度为 $O(m * n),ドル所以总体时间复杂度为 $O(m * n)$。 -- **空间复杂度**:$O(m * n)$。用到了二维数组保存状态,所以总体空间复杂度为 $O(m * n)$。因为 $dp[i][j]$ 的状态只依赖于上方值 $dp[i - 1][j]$ 和左侧值 $dp[i][j - 1],ドル而我们在进行遍历时的顺序刚好是从上至下、从左到右。所以我们可以使用长度为 $m$ 的一维数组来保存状态,从而将空间复杂度优化到 $O(m)$。 +- **时间复杂度**:$O(m \times n)$。初始条件赋值的时间复杂度为 $O(m + n),ドル两重循环遍历的时间复杂度为 $O(m * n),ドル所以总体时间复杂度为 $O(m \times n)$。 +- **空间复杂度**:$O(m \times n)$。用到了二维数组保存状态,所以总体空间复杂度为 $O(m \times n)$。因为 $dp[i][j]$ 的状态只依赖于上方值 $dp[i - 1][j]$ 和左侧值 $dp[i][j - 1],ドル而我们在进行遍历时的顺序刚好是从上至下、从左到右。所以我们可以使用长度为 $m$ 的一维数组来保存状态,从而将空间复杂度优化到 $O(m)$。 ### 2.2 整数拆分 diff --git "a/Solutions/0062. 344円270円215円345円220円214円350円267円257円345円276円204円.md" "b/Solutions/0062. 344円270円215円345円220円214円350円267円257円345円276円204円.md" index b9e4fde3..338afada 100644 --- "a/Solutions/0062. 344円270円215円345円220円214円350円267円257円345円276円204円.md" +++ "b/Solutions/0062. 344円270円215円345円220円214円350円267円257円345円276円204円.md" @@ -51,7 +51,7 @@ ###### 3. 状态转移方程 -因为我们每次只能向右、或者向下移动一步,因此想要走到 $(i, j),ドル只能从 $(i - 1, j)$ 向下走一步走过来;或者从 $(i, j - 1)$ 向右走一步走过来。所以可以写出状态转移方程为:$dp[i][j] = dp[i - 1][j] + dp[i][j - 1],ドル此时 $i> 0,j> 0$。 +因为我们每次只能向右、或者向下移动一步,因此想要走到 $(i, j),ドル只能从 $(i - 1, j)$ 向下走一步走过来;或者从 $(i, j - 1)$ 向右走一步走过来。所以可以写出状态转移方程为:$dp[i][j] = dp[i - 1][j] + dp[i][j - 1],ドル此时 $i> 0, j> 0$。 ###### 4. 初始条件 @@ -84,5 +84,5 @@ class Solution: ### 思路 1:复杂度分析 -- **时间复杂度**:$O(m * n)$。初始条件赋值的时间复杂度为 $O(m + n),ドル两重循环遍历的时间复杂度为 $O(m * n),ドル所以总体时间复杂度为 $O(m * n)$。 -- **空间复杂度**:$O(m * n)$。用到了二维数组保存状态,所以总体空间复杂度为 $O(m * n)$。因为 $dp[i][j]$ 的状态只依赖于上方值 $dp[i - 1][j]$ 和左侧值 $dp[i][j - 1],ドル而我们在进行遍历时的顺序刚好是从上至下、从左到右。所以我们可以使用长度为 $m$ 的一维数组来保存状态,从而将空间复杂度优化到 $O(m)$。 \ No newline at end of file +- **时间复杂度**:$O(m \times n)$。初始条件赋值的时间复杂度为 $O(m + n),ドル两重循环遍历的时间复杂度为 $O(m \times n),ドル所以总体时间复杂度为 $O(m \times n)$。 +- **空间复杂度**:$O(m \times n)$。用到了二维数组保存状态,所以总体空间复杂度为 $O(m \times n)$。因为 $dp[i][j]$ 的状态只依赖于上方值 $dp[i - 1][j]$ 和左侧值 $dp[i][j - 1],ドル而我们在进行遍历时的顺序刚好是从上至下、从左到右。所以我们可以使用长度为 $m$ 的一维数组来保存状态,从而将空间复杂度优化到 $O(m)$。 \ No newline at end of file diff --git "a/Solutions/0219. 345円255円230円345円234円250円351円207円215円345円244円215円345円205円203円347円264円240円 II.md" "b/Solutions/0219. 345円255円230円345円234円250円351円207円215円345円244円215円345円205円203円347円264円240円 II.md" index c00438b5..3c6f2207 100644 --- "a/Solutions/0219. 345円255円230円345円234円250円351円207円215円345円244円215円345円205円203円347円264円240円 II.md" +++ "b/Solutions/0219. 345円255円230円345円234円250円351円207円215円345円244円215円345円205円203円347円264円240円 II.md" @@ -7,7 +7,7 @@ **描述**:给定一个整数数组 `nums` 和一个整数 `k`。 -**要求**:判断是否存在 $nums[i] == nums[j](i \ne j),ドル并且 `i` 和 `j` 的差绝对值至多为 `k`。 +**要求**:判断是否存在 $nums[i] == nums[j](i \ne j),ドル并且 `i` 和 `j` 的差绝对值至多为 `k`。 **说明**: diff --git "a/Solutions/0279. 345円256円214円345円205円250円345円271円263円346円226円271円346円225円260円.md" "b/Solutions/0279. 345円256円214円345円205円250円345円271円263円346円226円271円346円225円260円.md" index 5e0e03bc..3d206cba 100644 --- "a/Solutions/0279. 345円256円214円345円205円250円345円271円263円346円226円271円346円225円260円.md" +++ "b/Solutions/0279. 345円256円214円345円205円250円345円271円263円346円226円271円346円225円260円.md" @@ -5,7 +5,7 @@ ## 题目大意 -**描述**:给定一个正整数 $n$。从中找到若干个完全平方数(比如 1ドル、4、9、16...$),使得它们的和等于 $n$。 +**描述**:给定一个正整数 $n$。从中找到若干个完全平方数(比如 1,ドル 4, 9, 16 ...$),使得它们的和等于 $n$。 **要求**:返回和为 $n$ 的完全平方数的最小数量。 @@ -35,7 +35,7 @@ 暴力枚举思路:对于小于 $n$ 的完全平方数,直接暴力枚举所有可能的组合,并且找到平方数个数最小的一个。 -并且对于所有小于 $n$ 的完全平方数($k = 1, 4, 9, 16, ...$),存在公式:$ans(n) = min(ans(n - k) + 1),k = 1,4,9,16,...$ +并且对于所有小于 $n$ 的完全平方数($k = 1, 4, 9, 16, ...$),存在公式:$ans(n) = min(ans(n - k) + 1), k = 1, 4, 9, 16 ...$ 即: **n 的完全平方数的最小数量 == n - k 的完全平方数的最小数量 + 1**。 diff --git "a/Solutions/0300. 346円234円200円351円225円277円351円200円222円345円242円236円345円255円220円345円272円217円345円210円227円.md" "b/Solutions/0300. 346円234円200円351円225円277円351円200円222円345円242円236円345円255円220円345円272円217円345円210円227円.md" index 93264f19..f63c826c 100644 --- "a/Solutions/0300. 346円234円200円351円225円277円351円200円222円345円242円236円345円255円220円345円272円217円345円210円227円.md" +++ "b/Solutions/0300. 346円234円200円351円225円277円351円200円222円345円242円236円345円255円220円345円272円217円345円210円227円.md" @@ -54,7 +54,7 @@ - 如果 $nums[j] \le nums[i],ドル则 $nums[i]$ 不可以接在 $nums[j]$ 后面,可以直接跳过。 -综上,我们的状态转移方程为:$dp[i] = max(dp[i], dp[j] + 1),0 \le j < i,nums[j] < nums[i]$。 +综上,我们的状态转移方程为:$dp[i] = max(dp[i], dp[j] + 1), 0 \le j < i, nums[j] < nums[i]$。 ###### 4. 初始条件 diff --git "a/Solutions/0312. 346円210円263円346円260円224円347円220円203円.md" "b/Solutions/0312. 346円210円263円346円260円224円347円220円203円.md" index a7b86ca9..f93d6779 100644 --- "a/Solutions/0312. 346円210円263円346円260円224円347円220円203円.md" +++ "b/Solutions/0312. 346円210円263円346円260円224円347円220円203円.md" @@ -63,7 +63,7 @@ $dp[i][j] = max \lbrace dp[i][k] + dp[k][j] + nums[i] \times nums[k] \times nums ###### 4. 初始条件 -- $dp[i][j]$ 表示的是开区间,则 $i < j - 1$。而当 $i \ge j - 1$ 时,所能获得的硬币数为 0ドル,ドル即 $dp[i][j] = 0,\quad i \ge$ +- $dp[i][j]$ 表示的是开区间,则 $i < j - 1$。而当 $i \ge j - 1$ 时,所能获得的硬币数为 0ドル,ドル即 $dp[i][j] = 0, \quad i \ge j - 1$。 ###### 5. 最终结果 diff --git "a/Solutions/0342. 4347円232円204円345円271円202円.md" "b/Solutions/0342. 4347円232円204円345円271円202円.md" index 81461fd9..6e7dae09 100644 --- "a/Solutions/0342. 4347円232円204円345円271円202円.md" +++ "b/Solutions/0342. 4347円232円204円345円271円202円.md" @@ -5,22 +5,22 @@ ## 题目大意 -给定一个整数 n,判断 n 是否是 4 的幂次方,如果是的话,返回 True。不是的话,返回 False。 +给定一个整数 $n,ドル判断 $n$ 是否是 4ドル$ 的幂次方,如果是的话,返回 True。不是的话,返回 False。 ## 解题思路 通过循环可以直接做。但有更好的方法。 -n 如果是 4 的幂次方,那么 n 肯定是 2 的幂次方,2 的幂次方二进制表示只含有一个 1,可以通过 n & (n - 1) 将 n 的最后位置上 的 1 置为 0,通过判断 n 是否满足 `n & (n - 1) == 0` 来判断 n 是否是 2 的幂次方。 +$n$ 如果是 4ドル$ 的幂次方,那么 $n$ 肯定是 2ドル$ 的幂次方,2ドル$ 的幂次方二进制表示只含有一个 1ドル,ドル可以通过 $n \text{ \& } (n - 1)$ 将 $n$ 的最后位置上 的 1ドル$ 置为 0ドル,ドル通过判断 $n$ 是否满足 $n \text { \& } (n - 1) == 0$ 来判断 $n$ 是否是 2ドル$ 的幂次方。 -若根据上述判断,得出 n 是 2 的幂次方,则可以写为:$n = x^{2k}$ 或者 $n = x^{2k+1}$。如果 n 是 4 的幂次方,则 $n = 2^{k}$。 +若根据上述判断,得出 $n$ 是 2ドル$ 的幂次方,则可以写为:$n = x^{2k}$ 或者 $n = x^{2k+1}$。如果 $n$ 是 4ドル$ 的幂次方,则 $n = 2^{k}$。 -下面来看一下 2ドル^{2x}、2^{2x}+1$ 的情况: +下面来看一下 2ドル^{2x}$、2ドル^{2x}+1$ 的情况: -- $(2^{2x} \% 3) = (4^x \% 3) = ((3+1)^x \% 3) == 1$ -- $(2^{2x+1} \% 3) = ((2*4^x) \% 3) = ((2*(3+1)^x) \% 3) == 2$ +- $(2^{2x} \mod 3) = (4^x \mod 3) = ((3+1)^x \mod 3) == 1$ +- $(2^{2x+1} \mod 3) = ((2 \times 4^x) \mod 3) = ((2 \times (3+1)^x) \mod 3) == 2$ -则如果 n % 3 == 1,则 n 为 4 的幂次方。 +则如果 $n \mod 3 == 1,ドル则 $n$ 为 4ドル$ 的幂次方。 ## 代码 diff --git "a/Solutions/0416. 345円210円206円345円211円262円347円255円211円345円222円214円345円255円220円351円233円206円.md" "b/Solutions/0416. 345円210円206円345円211円262円347円255円211円345円222円214円345円255円220円351円233円206円.md" index 40ce05b3..8fdf6be7 100644 --- "a/Solutions/0416. 345円210円206円345円211円262円347円255円211円345円222円214円345円255円220円351円233円206円.md" +++ "b/Solutions/0416. 345円210円206円345円211円262円347円255円211円345円222円214円345円255円220円351円233円206円.md" @@ -61,7 +61,7 @@ $dp[w] = \begin{cases} dp[w] & w < nums[i - 1] \cr max \lbrace dp[w], \quad dp[w ###### 4. 初始条件 -- 无论背包载重上限为多少,只要不选择物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[w] = 0,0 \le w \le W$。 +- 无论背包载重上限为多少,只要不选择物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[w] = 0, 0 \le w \le W$。 ###### 5. 最终结果 diff --git "a/Solutions/0526. 344円274円230円347円276円216円347円232円204円346円216円222円345円210円227円.md" "b/Solutions/0526. 344円274円230円347円276円216円347円232円204円346円216円222円345円210円227円.md" index a7662347..27390c6a 100644 --- "a/Solutions/0526. 344円274円230円347円276円216円347円232円204円346円216円222円345円210円227円.md" +++ "b/Solutions/0526. 344円274円230円347円276円216円347円232円204円346円216円222円345円210円227円.md" @@ -89,8 +89,8 @@ class Solution: 举个例子: -1. $n = 4, state = (1001)_2,ドル表示选择了数字 1ドル、4,ドル剩余数字 2ドル$ 和 3ドル$ 未被选择。 -2. $n = 6, state = (011010)_2,ドル表示选择了数字 2ドル、4、5,ドル剩余数字 1ドル、3、6$ 未被选择。 +1. $n = 4, state = (1001)_2,ドル表示选择了数字 1,ドル 4,ドル剩余数字 2ドル$ 和 3ドル$ 未被选择。 +2. $n = 6, state = (011010)_2,ドル表示选择了数字 2,ドル 4, 5,ドル剩余数字 1,ドル 3, 6$ 未被选择。 这样我们就可以使用 $n$ 位的二进制数 $state$ 来表示当前排列中数的选取情况。 @@ -116,7 +116,7 @@ class Solution: ###### 4. 初始条件 -- 不考虑任何数($i = 0,state = 0$)的情况下,方案数为 1ドル$。 +- 不考虑任何数($i = 0, state = 0$)的情况下,方案数为 1ドル$。 ###### 5. 最终结果 diff --git "a/Solutions/0543. 344円272円214円345円217円211円346円240円221円347円232円204円347円233円264円345円276円204円.md" "b/Solutions/0543. 344円272円214円345円217円211円346円240円221円347円232円204円347円233円264円345円276円204円.md" index 970e638d..a683d40f 100644 --- "a/Solutions/0543. 344円272円214円345円217円211円346円240円221円347円232円204円347円233円264円345円276円204円.md" +++ "b/Solutions/0543. 344円272円214円345円217円211円346円240円221円347円232円204円347円233円264円345円276円204円.md" @@ -51,7 +51,7 @@ 而右侧这棵特殊的二叉树,其直径长度所对应的路径是没有穿过根节点的($F \rightarrow D \rightarrow B \rightarrow E \rightarrow G$)。这种情况下:$\text{二叉树的直径} = \text{所有子树中最大直径长度}$。 -也就是说根为 $root$ 的二叉树的直径长度可能来自于 $\text{左子树高度} + \text{右子树高度},ドル也可能来自于 $子树中的最大直径,ドル即 $\text{二叉树的直径} = max(\text{左子树高度} + \text{右子树高度}, \quad \text{所有子树中最大直径长度})$。 +也就是说根为 $root$ 的二叉树的直径长度可能来自于 $\text{左子树高度} + \text{右子树高度},ドル也可能来自于 $\text{子树中的最大直径},ドル即 $\text{二叉树的直径} = max(\text{左子树高度} + \text{右子树高度}, \quad \text{所有子树中最大直径长度})$。 那么现在问题就变成为如何求「子树的高度」和「子树中的最大直径」。 diff --git "a/Solutions/0547. 347円234円201円344円273円275円346円225円260円351円207円217円.md" "b/Solutions/0547. 347円234円201円344円273円275円346円225円260円351円207円217円.md" index 8ce46be5..215cb992 100644 --- "a/Solutions/0547. 347円234円201円344円273円275円346円225円260円351円207円217円.md" +++ "b/Solutions/0547. 347円234円201円344円273円275円346円225円260円351円207円217円.md" @@ -90,5 +90,5 @@ class Solution: ### 思路 1:复杂度分析 -- **时间复杂度**:$O(n^2 \times \alpha(n))$。其中 $n$ 是城市的数量,$\alpha$ 是反 `Ackerman` 函数。 +- **时间复杂度**:$O(n^2 \times \alpha(n))$。其中 $n$ 是城市的数量,$\alpha$ 是反 `Ackerman` 函数。 - **空间复杂度**:$O(n)$。 \ No newline at end of file diff --git "a/Solutions/0873. 346円234円200円351円225円277円347円232円204円346円226円220円346円263円242円351円202円243円345円245円221円345円255円220円345円272円217円345円210円227円347円232円204円351円225円277円345円272円246円.md" "b/Solutions/0873. 346円234円200円351円225円277円347円232円204円346円226円220円346円263円242円351円202円243円345円245円221円345円255円220円345円272円217円345円210円227円347円232円204円351円225円277円345円272円246円.md" index 7a150131..0db68bfd 100644 --- "a/Solutions/0873. 346円234円200円351円225円277円347円232円204円346円226円220円346円263円242円351円202円243円345円245円221円345円255円220円345円272円217円345円210円227円347円232円204円351円225円277円345円272円246円.md" +++ "b/Solutions/0873. 346円234円200円351円225円277円347円232円204円346円226円220円346円263円242円351円202円243円345円245円221円345円255円220円345円272円217円345円210円227円347円232円204円351円225円277円345円272円246円.md" @@ -141,7 +141,7 @@ class Solution: ###### 3. 状态转移方程 -以 $arr[j]$、$arr[k]$ 结尾的斐波那契式子序列的最大长度 = 满足 $arr[i] + arr[j] = arr[k]$ 条件下,以 $arr[i]$、$arr[j]$ 结尾的斐波那契式子序列的最大长度加 1ドル$。即状态转移方程为:$dp[j][k] = max_{(A[i] + A[j] = A[k],i < j < k)}(dp[i][j] + 1)$。 +以 $arr[j]$、$arr[k]$ 结尾的斐波那契式子序列的最大长度 = 满足 $arr[i] + arr[j] = arr[k]$ 条件下,以 $arr[i]$、$arr[j]$ 结尾的斐波那契式子序列的最大长度加 1ドル$。即状态转移方程为:$dp[j][k] = max_{(A[i] + A[j] = A[k], i < j < k)}(dp[i][j] + 1)$。 ###### 4. 初始条件 diff --git "a/Solutions/1049. 346円234円200円345円220円216円344円270円200円345円235円227円347円237円263円345円244円264円347円232円204円351円207円215円351円207円217円 II.md" "b/Solutions/1049. 346円234円200円345円220円216円344円270円200円345円235円227円347円237円263円345円244円264円347円232円204円351円207円215円351円207円217円 II.md" index c49e695d..415844ee 100644 --- "a/Solutions/1049. 346円234円200円345円220円216円344円270円200円345円235円227円347円237円263円345円244円264円347円232円204円351円207円215円351円207円217円 II.md" +++ "b/Solutions/1049. 346円234円200円345円220円216円344円270円200円345円235円227円347円237円263円345円244円264円347円232円204円351円207円215円351円207円217円 II.md" @@ -67,7 +67,7 @@ $dp[w] = max \lbrace dp[w], dp[w - stones[i - 1]] + stones[i - 1] \rbrace$。 ###### 4. 初始条件 -- 无论背包载重上限为多少,只要不选择石头,可以获得的最大价值一定是 0ドル,ドル即 $dp[w] = 0,0 \le w \le W$。 +- 无论背包载重上限为多少,只要不选择石头,可以获得的最大价值一定是 0ドル,ドル即 $dp[w] = 0, 0 \le w \le W$。 ###### 5. 最终结果 diff --git "a/Solutions/1227. 351円243円236円346円234円272円345円272円247円344円275円215円345円210円206円351円205円215円346円246円202円347円216円207円.md" "b/Solutions/1227. 351円243円236円346円234円272円345円272円247円344円275円215円345円210円206円351円205円215円346円246円202円347円216円207円.md" index e0f29531..ec48ac3e 100644 --- "a/Solutions/1227. 351円243円236円346円234円272円345円272円247円344円275円215円345円210円206円351円205円215円346円246円202円347円216円207円.md" +++ "b/Solutions/1227. 351円243円236円346円234円272円345円272円247円344円275円215円345円210円206円351円205円215円346円246円202円347円216円207円.md" @@ -64,12 +64,12 @@ - 坐在第 $n$ 个乘客的位置上,这样第 $n$ 个乘客肯定无法坐到自己的位置上。 - - 在第 $[i + 1,n - 1]$ 之间找个位置坐。 + - 在第 $[i + 1, n - 1]$ 之间找个位置坐。 - 再来考虑第 $i$ 位乘客登机情况: - 第 $i$ 为乘客所面临的情况跟第 1ドル$ 位乘客所面临的情况类似,只不过问题的规模数从 $n$ 减小到了 $n - (i - 1)$。 -那么综合上面情况,可以得到 $f(n),(n \ge 3)$ 的递推式: +那么综合上面情况,可以得到 $f(n),(n \ge 3)$ 的递推式: $\begin{aligned} f(n) & = \frac{1}{n} * 1.0 + \frac{1}{n} * 0.0 + \frac{1}{n} * \sum_{i = 2}^{n-1} f(n - i + 1) \cr & = \frac{1}{n} (1.0 + \sum_{i = 2}^{n-1} f(n - i + 1)) \end{aligned}$ diff --git "a/Solutions/1486. 346円225円260円347円273円204円345円274円202円346円210円226円346円223円215円344円275円234円.md" "b/Solutions/1486. 346円225円260円347円273円204円345円274円202円346円210円226円346円223円215円344円275円234円.md" index cfcd95f9..c7f4486e 100644 --- "a/Solutions/1486. 346円225円260円347円273円204円345円274円202円346円210円226円346円223円215円344円275円234円.md" +++ "b/Solutions/1486. 346円225円260円347円273円204円345円274円202円346円210円226円346円223円215円344円275円234円.md" @@ -25,7 +25,7 @@ 本题中计算的是 $start \oplus (start + 2) \oplus (start + 4) \oplus (start + 6) \oplus ... \oplus (start+(2*(n-1)))$。 -可以看出,若 start 为奇数,则 $start+2、start+4、...、start+(2*(n-1))$ 都为奇数。若 start 为偶数,则 $start+2、start+4、...、start+(2*(n-1))$ 都为偶数。则它们对应二进制的最低位相同,则我们可以将最低位提取处理单独处理。从而将公式转换一下。 +可以看出,若 start 为奇数,则 $start+2, start + 4, ..., start + (2 \times(n - 1))$ 都为奇数。若 start 为偶数,则 $start + 2, start + 4, ..., start + (2 \times(n - 1))$ 都为偶数。则它们对应二进制的最低位相同,则我们可以将最低位提取处理单独处理。从而将公式转换一下。 令 $s = \frac{start}{2},ドル则等式变为 $(s) \oplus (s+1) \oplus (s+2) \oplus (s+3) \oplus ... \oplus (s+(n-1)) * 2 + e,ドルe 表示运算结果的最低位。 diff --git "a/Solutions/1879. 344円270円244円344円270円252円346円225円260円347円273円204円346円234円200円345円260円217円347円232円204円345円274円202円346円210円226円345円200円274円344円271円213円345円222円214円.md" "b/Solutions/1879. 344円270円244円344円270円252円346円225円260円347円273円204円346円234円200円345円260円217円347円232円204円345円274円202円346円210円226円345円200円274円344円271円213円345円222円214円.md" index 0980a38c..d95fe4cb 100644 --- "a/Solutions/1879. 344円270円244円344円270円252円346円225円260円347円273円204円346円234円200円345円260円217円347円232円204円345円274円202円346円210円226円345円200円274円344円271円213円345円222円214円.md" +++ "b/Solutions/1879. 344円270円244円344円270円252円346円225円260円347円273円204円346円234円200円345円260円217円347円232円204円345円274円202円346円210円226円345円200円274円344円271円213円345円222円214円.md" @@ -52,8 +52,8 @@ 举个例子: -1. $nums2 = \lbrace 1, 2, 3, 4 \rbrace,state = (1001)_2,ドル表示选择了第 1ドル$ 个元素和第 4ドル$ 个元素,也就是 1ドル$、4ドル$。 -2. $nums2 = \lbrace 1, 2, 3, 4, 5, 6 \rbrace,state = (011010)_2,ドル表示选择了第 2ドル$ 个元素、第 4ドル$ 个元素、第 5ドル$ 个元素,也就是 2ドル$、4ドル$、5ドル$。 +1. $nums2 = \lbrace 1, 2, 3, 4 \rbrace,ドル$state = (1001)_2,ドル表示选择了第 1ドル$ 个元素和第 4ドル$ 个元素,也就是 1ドル$、4ドル$。 +2. $nums2 = \lbrace 1, 2, 3, 4, 5, 6 \rbrace,ドル$state = (011010)_2,ドル表示选择了第 2ドル$ 个元素、第 4ドル$ 个元素、第 5ドル$ 个元素,也就是 2ドル$、4ドル$、5ドル$。 这样,我们就可以通过动态规划的方式来解决这道题。 @@ -71,7 +71,7 @@ 对于当前状态 $dp[state],ドル肯定是从比 $state$ 少选一个元素的状态中递推而来。我们可以枚举少选一个元素的状态,找到可以组成的异或值之和最小值,赋值给 $dp[state]$。 -举个例子 $nums2 = \lbrace 1, 2, 3, 4 \rbrace,state = (1001)_2,ドル表示选择了第 1ドル$ 个元素和第 4ドル$ 个元素,也就是 1ドル$、4ドル$。那么 $state$ 只能从 $(1000)_2$ 和 $(0001)_2$ 这两个状态转移而来,我们只需要枚举这两种状态,并求出转移过来的异或值之和最小值。 +举个例子 $nums2 = \lbrace 1, 2, 3, 4 \rbrace,ドル$state = (1001)_2,ドル表示选择了第 1ドル$ 个元素和第 4ドル$ 个元素,也就是 1ドル$、4ドル$。那么 $state$ 只能从 $(1000)_2$ 和 $(0001)_2$ 这两个状态转移而来,我们只需要枚举这两种状态,并求出转移过来的异或值之和最小值。 即状态转移方程为:$dp[state] = min(dp[state], \quad dp[state \oplus (1 \text{ <}\text{< } i)] + (nums1[i] \oplus nums2[one\underline{}cnt - 1])),ドル其中 $state$ 第 $i$ 位一定为 1ドル,ドル$one\underline{}cnt$ 为 $state$ 中 1ドル$ 的个数。 diff --git "a/Solutions/1994. 345円245円275円345円255円220円351円233円206円347円232円204円346円225円260円347円233円256円.md" "b/Solutions/1994. 345円245円275円345円255円220円351円233円206円347円232円204円346円225円260円347円233円256円.md" index 8027558d..b0dbda91 100644 --- "a/Solutions/1994. 345円245円275円345円255円220円351円233円206円347円232円204円346円225円260円347円233円256円.md" +++ "b/Solutions/1994. 345円245円275円345円255円220円351円233円206円347円232円204円346円225円260円347円233円256円.md" @@ -77,7 +77,7 @@ 对于 $nums$ 中的每个数 $num,ドル其对应出现次数为 $cnt$。我们可以通过试除法,将 $num$ 分解为不同的质因数,并使用「状态压缩」的方式,用一个二进制数 $cur\underline{}state$ 来表示当前数 $num$ 中使用了哪些质因数。然后枚举所有状态,找到与 $cur\underline{}state$ 不冲突的状态 $state$(也就是除了 $cur\underline{}state$ 中选择的质因数外,选择的其他质因数情况,比如 $cur\underline{}state$ 选择了 2ドル$ 和 5ドル,ドル则枚举不选择 2ドル$ 和 5ドル$ 的状态)。 -此时,状态转移方程为:$dp[state | cur\underline{}state] = \sum (dp[state] \times cnt) \mod MOD ,\quad state$ & $cur\underline{}state == 0$ +此时,状态转移方程为:$dp[state | cur\underline{}state] = \sum (dp[state] \times cnt) \mod MOD , \quad state \text{ \& } cur\underline{}state == 0$ ###### 4. 初始条件 diff --git "a/Solutions/345円211円221円346円214円207円 Offer 15. 344円272円214円350円277円233円345円210円266円344円270円2551円347円232円204円344円270円252円346円225円260円.md" "b/Solutions/345円211円221円346円214円207円 Offer 15. 344円272円214円350円277円233円345円210円266円344円270円2551円347円232円204円344円270円252円346円225円260円.md" index 53bd3772..07700acb 100644 --- "a/Solutions/345円211円221円346円214円207円 Offer 15. 344円272円214円350円277円233円345円210円266円344円270円2551円347円232円204円344円270円252円346円225円260円.md" +++ "b/Solutions/345円211円221円346円214円207円 Offer 15. 344円272円214円350円277円233円345円210円266円344円270円2551円347円232円204円344円270円252円346円225円260円.md" @@ -17,7 +17,7 @@ ### 2. 改进位运算 -利用 $n \text{ \& } (n-1)$ 。这个运算刚好可以将 n 的二进制中最低位的 1ドル$ 变为 0ドル$。 比如 $n = 6$ 时,6ドル = (110)_2,6-1 = (101)_2, (110)_2 \text{ \& } (101)_2 = (100)_2$ 。 +利用 $n \text{ \& } (n-1)$ 。这个运算刚好可以将 n 的二进制中最低位的 1ドル$ 变为 0ドル$。 比如 $n = 6$ 时,6ドル = (110)_2,ドル6ドル - 1 = (101)_2,ドル$(110)_2 \text{ \& } (101)_2 = (100)_2$ 。 利用这个位运算,不断的将 $n$ 中最低位的 1ドル$ 变为 0ドル,ドル直到 $n$ 变为 0ドル$ 即可,其变换次数就是我们要求的结果。 diff --git "a/Solutions/345円211円221円346円214円207円 Offer 45. 346円212円212円346円225円260円347円273円204円346円216円222円346円210円220円346円234円200円345円260円217円347円232円204円346円225円260円.md" "b/Solutions/345円211円221円346円214円207円 Offer 45. 346円212円212円346円225円260円347円273円204円346円216円222円346円210円220円346円234円200円345円260円217円347円232円204円346円225円260円.md" index eac561d7..3271a250 100644 --- "a/Solutions/345円211円221円346円214円207円 Offer 45. 346円212円212円346円225円260円347円273円204円346円216円222円346円210円220円346円234円200円345円260円217円347円232円204円346円225円260円.md" +++ "b/Solutions/345円211円221円346円214円207円 Offer 45. 346円212円212円346円225円260円347円273円204円346円216円222円346円210円220円346円234円200円345円260円217円347円232円204円346円225円260円.md" @@ -37,8 +37,8 @@ 本质上是给数组进行排序。假设 $x$、$y$ 是数组 $nums$ 中的两个元素。则排序的判断规则如下所示: -- 如果拼接字符串 $x + y> y + x,ドル则 $x$ 大于 $y ,ドル$y$ 应该排在 $x$ 前面,从而使拼接起来的数字尽可能的小。 -- 反之,如果拼接字符串 $x + y < y + x,ドル则 $x$ 小于 $y ,ドル$x$ 应该排在 $y$ 前面,从而使拼接起来的数字尽可能的小。 +- 如果拼接字符串 $x + y> y + x,ドル则 $x$ 大于 $y,ドル$y$ 应该排在 $x$ 前面,从而使拼接起来的数字尽可能的小。 +- 反之,如果拼接字符串 $x + y < y + x,ドル则 $x$ 小于 $y,ドル$x$ 应该排在 $y$ 前面,从而使拼接起来的数字尽可能的小。 按照上述规则,对原数组进行排序。这里使用了 `functools.cmp_to_key` 自定义排序函数。 diff --git "a/Solutions/345円211円221円346円214円207円 Offer II 093. 346円234円200円351円225円277円346円226円220円346円263円242円351円202円243円345円245円221円346円225円260円345円210円227円.md" "b/Solutions/345円211円221円346円214円207円 Offer II 093. 346円234円200円351円225円277円346円226円220円346円263円242円351円202円243円345円245円221円346円225円260円345円210円227円.md" index 9bcae110..58967187 100644 --- "a/Solutions/345円211円221円346円214円207円 Offer II 093. 346円234円200円351円225円277円346円226円220円346円263円242円351円202円243円345円245円221円346円225円260円345円210円227円.md" +++ "b/Solutions/345円211円221円346円214円207円 Offer II 093. 346円234円200円351円225円277円346円226円220円346円263円242円351円202円243円345円245円221円346円225円260円345円210円227円.md" @@ -110,7 +110,7 @@ class Solution: 这道题用动态规划来做,难点在于如何「定义状态」和「定义状态转移方程」。 - 定义状态:`dp[i][j]` 表示以 `arr[i]`、`arr[j]` 为结尾的斐波那契式子序列的最大长度。 -- 定义状态转移方程:$dp[j][k] = max_{(arr[i] + arr[j] = arr[k],i < j < k)}(dp[i][j] + 1)$ +- 定义状态转移方程:$dp[j][k] = max_{(arr[i] + arr[j] = arr[k], i < j < k)}(dp[i][j] + 1)$ - 意思为:以 `arr[j]`、`arr[k]` 结尾的斐波那契式子序列的最大长度 = 满足 `arr[i] + arr[j] = arr[k]` 条件下,以 `arr[i]`、`arr[j]` 结尾的斐波那契式子序列的最大长度 + 1。 但是直接这样做其实跟 **1. 暴力解法** 一样仍会超时,所以我们依旧采用哈希表优化的方式来提高效率,降低算法的时间复杂度。 From bcb1fa2e65e7f0603ea0df485b4e8582fb535d57 Mon Sep 17 00:00:00 2001 From: ITCharge Date: 2023年9月20日 17:44:09 +0800 Subject: [PATCH 2/2] =?UTF-8?q?Update=200341.=20=E6=89=81=E5=B9=B3?= =?UTF-8?q?=E5=8C=96=E5=B5=8C=E5=A5=97=E5=88=97=E8=A1=A8=E8=BF=AD=E4=BB=A3?= =?UTF-8?q?=E5=99=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...210円227円350円241円250円350円277円255円344円273円243円345円231円250円.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Solutions/0341. 346円211円201円345円271円263円345円214円226円345円265円214円345円245円227円345円210円227円350円241円250円350円277円255円344円273円243円345円231円250円.md" "b/Solutions/0341. 346円211円201円345円271円263円345円214円226円345円265円214円345円245円227円345円210円227円350円241円250円350円277円255円344円273円243円345円231円250円.md" index 443c7e11..dae241e4 100644 --- "a/Solutions/0341. 346円211円201円345円271円263円345円214円226円345円265円214円345円245円227円345円210円227円350円241円250円350円277円255円344円273円243円345円231円250円.md" +++ "b/Solutions/0341. 346円211円201円345円271円263円345円214円226円345円265円214円345円245円227円345円210円227円350円241円250円350円277円255円344円273円243円345円231円250円.md" @@ -11,7 +11,7 @@ NestedInteger 类提供了三个方法: - `isInteger()`,判断当前存储的对象是否为 int; - `getInteger()` ,如果当前存储的元素是 int 型的,那么返回当前的结果 int,否则调用会失败; -- `getList()`,如果当前存储的元素是 List 型的,那么返回该 List,否则调用会失败。 +- `getList()`,如果当前存储的元素是 `List` 型的,那么返回该 List,否则调用会失败。 要求:实现一个迭代器将其扁平化,使之能够遍历这个列表中的所有整数。

AltStyle によって変換されたページ (->オリジナル) /