Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 325f885

Browse files
committed
修正 Latex 语句格式
1 parent e40d2b4 commit 325f885

29 files changed

+72
-72
lines changed

Contents/00.Introduction/02.Algorithm-Complexity.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ def algorithm(n):
185185
return cnt
186186
```
187187

188-
上述代码中 `cnt = 1` 的时间复杂度为 $O(1)$ 可以忽略不算。`while` 循环体中 $cnt$ 从 $1$ 开始,每循环一次都乘以 $2$。当大于等于 $n$ 时循环结束。变量 $cnt$ 的取值是一个等比数列:$2^02^12^2,…,2^x$,根据 $2^x = n$,可以得出这段循环体的执行次数为 $\log_2n$,所以这段代码的时间复杂度为 $O(\log_2n)$。
188+
上述代码中 `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)$。
189189

190190
因为 $\log n = k \times \log_2 n$,这里 $k = 3.322$,所以,$\log n$ 与 $\log_2 n$ 的差别比较小。为了方便书写,通常我们将对数时间复杂度写作是 $O(\log n)$。
191191

Contents/07.Tree/01.Binary-Tree/01.Binary-Tree-Basic.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
- 包括根节点在内,每个节点可以有多个后继节点。
1616
- 当 $n > 1$ 时,除了根节点之外的其他节点,可分为 $m(m > 0)$ 个互不相交的有限集合 $T_1, T_2, ..., T_m$,其中每一个集合本身又是一棵树,并且被称为根的 **「子树(SubTree)」**
1717

18-
如下图所示,红色节点 $A$ 是根节点,除了根节点之外,还有 `3` 棵互不相交的子树 $T_1(B、E、H、I、G)$、$T_2(C)$、$T_3(D、F、G、K)$。
18+
如下图所示,红色节点 $A$ 是根节点,除了根节点之外,还有 `3` 棵互不相交的子树 $T_1(B, E, H, I, G)$、$T_2(C)$、$T_3(D, F, G, K)$。
1919

2020
![](https://qcdn.itcharge.cn/images/20220218104556.png)
2121

Contents/07.Tree/04.Binary-Indexed-Tree/01.Binary-Indexed-Tree.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
### 1.1 树状数组的定义
44

5-
> **树状数组(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)$。
5+
> **树状数组(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)$。
66
77
### 1.2 树状数组的原理
88

Contents/10.Dynamic-Programming/04.Knapsack-Problem/02.Knapsack-Problem-02.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,12 @@
3636
3737
则状态转移方程为:
3838

39-
$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$。
39+
$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$。
4040

4141
###### 4. 初始条件
4242

43-
- 如果背包载重上限为 $0$,则无论选取什么物品,可以获得的最大价值一定是 $0$,即 $dp[i][0] = 00 \le i \le size$。
44-
- 无论背包载重上限是多少,前 $0$ 种物品所能获得的最大价值一定为 $0$,即 $dp[0][w] = 00 \le w \le W$。
43+
- 如果背包载重上限为 $0$,则无论选取什么物品,可以获得的最大价值一定是 $0$,即 $dp[i][0] = 0, 0 \le i \le size$。
44+
- 无论背包载重上限是多少,前 $0$ 种物品所能获得的最大价值一定为 $0$,即 $dp[0][w] = 0, 0 \le w \le W$。
4545

4646
###### 5. 最终结果
4747

@@ -81,15 +81,15 @@ class Solution:
8181

8282
我们将之前的状态转移方程
8383

84-
$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$
84+
$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$
8585

8686
进行展开:
8787

88-
$(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$
88+
$(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$
8989

9090
而对于 $dp[i][w - weight[i - 1]]$ 我们有:
9191

92-
$(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$
92+
$(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$
9393

9494
通过观察可以发现:
9595

@@ -133,8 +133,8 @@ $\quad dp[i][w] = \begin{cases} dp[i - 1][w] & w < weight[i - 1] \cr max \lbrac
133133

134134
###### 4. 初始条件
135135

136-
- 如果背包载重上限为 $0$,则无论选取什么物品,可以获得的最大价值一定是 $0$,即 $dp[i][0] = 00 \le i \le size$。
137-
- 无论背包载重上限是多少,前 $0$ 种物品所能获得的最大价值一定为 $0$,即 $dp[0][w] = 00 \le w \le W$。
136+
- 如果背包载重上限为 $0$,则无论选取什么物品,可以获得的最大价值一定是 $0$,即 $dp[i][0] = 0, 0 \le i \le size$。
137+
- 无论背包载重上限是多少,前 $0$ 种物品所能获得的最大价值一定为 $0$,即 $dp[0][w] = 0, 0 \le w \le W$。
138138

139139
###### 5. 最终结果
140140

@@ -201,7 +201,7 @@ $dp[w] = \begin{cases} dp[w] & w < weight[i - 1] \cr max \lbrace dp[w], \quad d
201201

202202
###### 4. 初始条件
203203

204-
- 无论背包载重上限为多少,只要不选择物品,可以获得的最大价值一定是 $0$,即 $dp[w] = 00 \le w \le W$。
204+
- 无论背包载重上限为多少,只要不选择物品,可以获得的最大价值一定是 $0$,即 $dp[w] = 0, 0 \le w \le W$。
205205

206206
###### 5. 最终结果
207207

Contents/10.Dynamic-Programming/04.Knapsack-Problem/03.Knapsack-Problem-03.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ $dp[i][w] = max \lbrace dp[i - 1][w - k \times weight[i - 1]] + k \times value[i
2626

2727
###### 4. 初始条件
2828

29-
- 如果背包载重上限为 $0$,则无论选取什么物品,可以获得的最大价值一定是 $0$,即 $dp[i][0] = 00 \le i \le size$。
30-
- 无论背包载重上限是多少,前 $0$ 种物品所能获得的最大价值一定为 $0$,即 $dp[0][w] = 00 \le w \le W$。
29+
- 如果背包载重上限为 $0$,则无论选取什么物品,可以获得的最大价值一定是 $0$,即 $dp[i][0] = 0, 0 \le i \le size$。
30+
- 无论背包载重上限是多少,前 $0$ 种物品所能获得的最大价值一定为 $0$,即 $dp[0][w] = 0, 0 \le w \le W$。
3131

3232
###### 5. 最终结果
3333

@@ -121,7 +121,7 @@ class Solution:
121121

122122
但我们还是可以从物品数量入手,通过「二进制优化」的方式,将算法的时间复杂度降低。
123123

124-
> **二进制优化**:简单来说,就是把物品的数量 $count[i]$ 拆分成「由 $1、2、4、…、2^m$ 件单个物品组成的大物品」,以及「剩余不足 $2$ 的整数次幂数量的物品,由 $count[i] -2^{\lfloor \log_2(count[i] + 1) \rfloor - 1}$ 件单个物品组成大物品」。
124+
> **二进制优化**:简单来说,就是把物品的数量 $count[i]$ 拆分成「由 $1, 2, 4, …, 2^m$ 件单个物品组成的大物品」,以及「剩余不足 $2$ 的整数次幂数量的物品,由 $count[i] -2^{\lfloor \log_2(count[i] + 1) \rfloor - 1}$ 件单个物品组成大物品」。
125125
126126
举个例子,第 $i$ 件物品的数量为 $31$,采用「二进制优化」的方式,可以拆分成 $31 = 1 + 2 + 4 + 8 + 16$ 一共 $5$ 件物品。也将是将 $31$ 件物品分成了 $5$ 件大物品:
127127

Contents/10.Dynamic-Programming/04.Knapsack-Problem/04.Knapsack-Problem-04.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -112,12 +112,12 @@ class Solution:
112112

113113
则状态转移方程为:
114114

115-
$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]$
115+
$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]$
116116

117117
###### 4. 初始条件
118118

119-
- 如果背包载重上限为 $0$,则无论选取什么物品,可以获得的最大价值一定是 $0$,即 $dp[i][0] = 00 \le i \le size$。
120-
- 无论背包载重上限是多少,前 $0$ 组物品所能获得的最大价值一定为 $0$,即 $dp[0][w] = 00 \le w \le W$。
119+
- 如果背包载重上限为 $0$,则无论选取什么物品,可以获得的最大价值一定是 $0$,即 $dp[i][0] = 0, 0 \le i \le size$。
120+
- 无论背包载重上限是多少,前 $0$ 组物品所能获得的最大价值一定为 $0$,即 $dp[0][w] = 0, 0 \le w \le W$。
121121

122122
###### 5. 最终结果
123123

@@ -163,11 +163,11 @@ class Solution:
163163

164164
###### 3. 状态转移方程
165165

166-
$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]$
166+
$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]$
167167

168168
###### 4. 初始条件
169169

170-
- 无论背包载重上限为多少,只要不选择物品,可以获得的最大价值一定是 $0$,即 $dp[w] = 00 \le w \le W$。
170+
- 无论背包载重上限为多少,只要不选择物品,可以获得的最大价值一定是 $0$,即 $dp[w] = 0, 0 \le w \le W$。
171171

172172
###### 5. 最终结果
173173

@@ -229,11 +229,11 @@ $dp[i][w][v] = max(dp[i - 1][w][v], dp[i - 1][w - weight[i - 1]][v - volume[i -
229229
###### 4. 初始条件
230230

231231
- 如果背包载重上限为 $0$ 或者容量上限为 $0$,则无论选取什么物品,可以获得的最大价值一定是 $0$,即:
232-
- $dp[i][w][0] = 00 \le i \le size0 \le w \le W$
233-
- $dp[i][0][v] = 00 \le i \le size0 \le v \le V$
232+
- $dp[i][w][0] = 0, 0 \le i \le size, 0 \le w \le W$
233+
- $dp[i][0][v] = 0, 0 \le i \le size, 0 \le v \le V$
234234

235235
- 无论背包载重上限是多少,前 $0$ 种物品所能获得的最大价值一定为 $0$,即:
236-
- $dp[0][w][v] = 00 \le w \le W0 \le v \le V$
236+
- $dp[0][w][v] = 0, 0 \le w \le W, 0 \le v \le V$
237237

238238

239239
###### 5. 最终结果
@@ -290,8 +290,8 @@ $dp[w][v] = max \lbrace dp[w][v], \quad dp[w - weight[i - 1]][v - volume[i - 1]]
290290
###### 4. 初始条件
291291

292292
- 如果背包载重上限为 $0$ 或者容量上限为 $0$,则无论选取什么物品,可以获得的最大价值一定是 $0$,即:
293-
- $dp[w][0] = 00 \le w \le W$
294-
- $dp[0][v] = 00 \le v \le V$
293+
- $dp[w][0] = 0, 0 \le w \le W$
294+
- $dp[0][v] = 0, 0 \le v \le V$
295295

296296

297297
###### 5. 最终结果

Contents/10.Dynamic-Programming/04.Knapsack-Problem/05.Knapsack-Problem-05.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,18 @@
66
77
在背包问题中,有的题目不要求把背包装满,而有的题目要求恰好装满背包。
88

9-
如果题目要求「恰好装满背包」,则我们可在原有状态定义、状态转移方程的基础上,在初始化时,令 $dp[0] = 0$,以及 $d[w] = -\infty1 \le w \le W$。 这样就可以保证最终得到的 $dp[W]$ 为恰好装满背包的最大价值总和。
9+
如果题目要求「恰好装满背包」,则我们可在原有状态定义、状态转移方程的基础上,在初始化时,令 $dp[0] = 0$,以及 $d[w] = -\infty, 1 \le w \le W$。 这样就可以保证最终得到的 $dp[W]$ 为恰好装满背包的最大价值总和。
1010

1111
这是因为:初始化的 $dp$ 数组实际上就是在没有任何物品可以放入背包时的「合法状态」。
1212

1313
如果不要求恰好装满背包,那么:
1414

15-
1. 任何载重上限下的背包,在不放入任何物品时,都有一个合法解,此时背包所含物品的最大价值为 $0$,即 $dp[w] = 00 \le w \le W$。
15+
1. 任何载重上限下的背包,在不放入任何物品时,都有一个合法解,此时背包所含物品的最大价值为 $0$,即 $dp[w] = 0, 0 \le w \le W$。
1616

1717
而如果要求恰好装满背包,那么:
1818

1919
1. 只有载重上限为 $0$ 的背包,在不放入物品时,能够恰好装满背包(有合法解),此时背包所含物品的最大价值为 $0$,即 $dp[0] = 0$。
20-
2. 其他载重上限下的背包,在放入物品的时,都不能恰好装满背包(都没有合法解),此时背包所含物品的最大价值属于未定义状态,值应为 $-\infty$,即 $dp[w] = 00 \le w \le W$。
20+
2. 其他载重上限下的背包,在放入物品的时,都不能恰好装满背包(都没有合法解),此时背包所含物品的最大价值属于未定义状态,值应为 $-\infty$,即 $dp[w] = 0, 0 \le w \le W$。
2121

2222
这样在进行状态转移时,我们可以通过判断 $dp[w]$ 与 $-\infty$ 的关系,来判断是否能恰好装满背包。
2323

@@ -32,7 +32,7 @@
3232
3. **状态转移方程**:$dp[w] = dp[w] + dp[w - weight[i - 1]]$
3333
4. **初始条件**
3434
1. 只有载重上限为 $0$ 的背包,在不放入物品时,能够恰好装满背包(有合法解),此时背包所含物品的最大价值为 $0$,即 $dp[0] = 0$。
35-
2. 其他载重上限下的背包,在放入物品的时,都不能恰好装满背包(都没有合法解),此时背包所含物品的最大价值属于未定义状态,值应为 $-\infty$,即 $dp[w] = 00 \le w \le W$。
35+
2. 其他载重上限下的背包,在放入物品的时,都不能恰好装满背包(都没有合法解),此时背包所含物品的最大价值属于未定义状态,值应为 $-\infty$,即 $dp[w] = 0, 0 \le w \le W$。
3636
5. **最终结果**:根据我们之前定义的状态, $dp[w]$ 表示为:将物品装入最多能装重量为 $w$ 的背包中的方案总数。则最终结果为 $dp[W]$,其中 $W$ 为背包的载重上限。
3737

3838
#### 思路 1:代码
@@ -192,7 +192,7 @@ class Solution:
192192

193193
> **0-1 背包问题求具体方案**:有 $n$ 种物品和一个最多能装重量为 $W$ 的背包,第 $i$ 种物品的重量为 $weight[i]$,价值为 $value[i]$,每件物品有且只有 $1$ 件。请问将哪些物品装入背包,可使这些物品的总重量不超过背包载重上限,且价值总和最大?
194194
195-
#### 思路 4:动态规划 + 路径记录
195+
#### 4:动态规划 + 路径记录
196196

197197
0-1 背包问题的状态转移方程为:$dp[i][w] = max \lbrace dp[i - 1][w], \quad dp[i - 1][w - weight[i - 1]] + value[i - 1] \rbrace$
198198

Contents/10.Dynamic-Programming/05.Interval-DP/01.Interval-DP.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ for i in range(size - 1, -1, -1): # 枚举区间起点
4040

4141
#### 1.2.3 第 2 种区间 DP 问题基本思路
4242

43-
多个(大于等于 $2$ 个)小区间转移到大区间的区间 DP 问题的状态转移方程一般为:$dp[i][j] = max / min \lbrace dp[i][k] + dp[k + 1][j] + cost[i][j] \rbrace\quad i < k \le j$。
43+
多个(大于等于 $2$ 个)小区间转移到大区间的区间 DP 问题的状态转移方程一般为:$dp[i][j] = max / min \lbrace dp[i][k] + dp[k + 1][j] + cost[i][j] \rbrace, \quad i < k \le j$。
4444

4545
1. 其中状态 $dp[i][j]$ 表示为:区间 $[i, j]$ (即下标位置 $i$ 到下标位置 $j$ 上所有元素)上的最大价值。
4646
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
232232

233233
###### 4. 初始条件
234234

235-
- $dp[i][j]$ 表示的是开区间,则 $i < j - 1$。而当 $i \ge j - 1$ 时,所能获得的硬币数为 $0$,即 $dp[i][j] = 0\quad i \ge j - 1$。
235+
- $dp[i][j]$ 表示的是开区间,则 $i < j - 1$。而当 $i \ge j - 1$ 时,所能获得的硬币数为 $0$,即 $dp[i][j] = 0, \quad i \ge j - 1$。
236236

237237
###### 5. 最终结果
238238

Contents/10.Dynamic-Programming/07.State-DP/01.State-DP.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,8 @@
154154

155155
举个例子:
156156

157-
1. $nums2 = \lbrace 1, 2, 3, 4 \rbracestate = (1001)_2$,表示选择了第 $1$ 个元素和第 $4$ 个元素,也就是 $1$、$4$。
158-
2. $nums2 = \lbrace 1, 2, 3, 4, 5, 6 \rbracestate = (011010)_2$,表示选择了第 $2$ 个元素、第 $4$ 个元素、第 $5$ 个元素,也就是 $2$、$4$、$5$。
157+
1. $nums2 = \lbrace 1, 2, 3, 4 \rbrace, state = (1001)_2$,表示选择了第 $1$ 个元素和第 $4$ 个元素,也就是 $1$、$4$。
158+
2. $nums2 = \lbrace 1, 2, 3, 4, 5, 6 \rbrace, state = (011010)_2$,表示选择了第 $2$ 个元素、第 $4$ 个元素、第 $5$ 个元素,也就是 $2$、$4$、$5$。
159159

160160
这样,我们就可以通过动态规划的方式来解决这道题。
161161

@@ -173,7 +173,7 @@
173173

174174
对于当前状态 $dp[state]$,肯定是从比 $state$ 少选一个元素的状态中递推而来。我们可以枚举少选一个元素的状态,找到可以组成的异或值之和最小值,赋值给 $dp[state]$
175175

176-
举个例子 $nums2 = \lbrace 1, 2, 3, 4 \rbracestate = (1001)_2$,表示选择了第 $1$ 个元素和第 $4$ 个元素,也就是 $1$、$4$。那么 $state$ 只能从 $(1000)_2$ 和 $(0001)_2$ 这两个状态转移而来,我们只需要枚举这两种状态,并求出转移过来的异或值之和最小值。
176+
举个例子 $nums2 = \lbrace 1, 2, 3, 4 \rbrace$,$state = (1001)_2$,表示选择了第 $1$ 个元素和第 $4$ 个元素,也就是 $1$、$4$。那么 $state$ 只能从 $(1000)_2$ 和 $(0001)_2$ 这两个状态转移而来,我们只需要枚举这两种状态,并求出转移过来的异或值之和最小值。
177177

178178
即状态转移方程为:$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$ 的个数。
179179

Contents/10.Dynamic-Programming/08.Counting-DP/01.Counting-DP.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@
8282

8383
###### 3. 状态转移方程
8484

85-
因为我们每次只能向右、或者向下移动一步,因此想要走到 $(i, j)$,只能从 $(i - 1, j)$ 向下走一步走过来;或者从 $(i, j - 1)$ 向右走一步走过来。所以可以写出状态转移方程为:$dp[i][j] = dp[i - 1][j] + dp[i][j - 1]$,此时 $i > 0j > 0$。
85+
因为我们每次只能向右、或者向下移动一步,因此想要走到 $(i, j)$,只能从 $(i - 1, j)$ 向下走一步走过来;或者从 $(i, j - 1)$ 向右走一步走过来。所以可以写出状态转移方程为:$dp[i][j] = dp[i - 1][j] + dp[i][j - 1]$,此时 $i > 0, j > 0$。
8686

8787
###### 4. 初始条件
8888

@@ -115,8 +115,8 @@ class Solution:
115115

116116
##### 思路 1:复杂度分析
117117

118-
- **时间复杂度**:$O(m * n)$。初始条件赋值的时间复杂度为 $O(m + n)$,两重循环遍历的时间复杂度为 $O(m * n)$,所以总体时间复杂度为 $O(m * n)$。
119-
- **空间复杂度**:$O(m * n)$。用到了二维数组保存状态,所以总体空间复杂度为 $O(m * n)$。因为 $dp[i][j]$ 的状态只依赖于上方值 $dp[i - 1][j]$ 和左侧值 $dp[i][j - 1]$,而我们在进行遍历时的顺序刚好是从上至下、从左到右。所以我们可以使用长度为 $m$ 的一维数组来保存状态,从而将空间复杂度优化到 $O(m)$。
118+
- **时间复杂度**:$O(m \times n)$。初始条件赋值的时间复杂度为 $O(m + n)$,两重循环遍历的时间复杂度为 $O(m * n)$,所以总体时间复杂度为 $O(m \times n)$。
119+
- **空间复杂度**:$O(m \times n)$。用到了二维数组保存状态,所以总体空间复杂度为 $O(m \times n)$。因为 $dp[i][j]$ 的状态只依赖于上方值 $dp[i - 1][j]$ 和左侧值 $dp[i][j - 1]$,而我们在进行遍历时的顺序刚好是从上至下、从左到右。所以我们可以使用长度为 $m$ 的一维数组来保存状态,从而将空间复杂度优化到 $O(m)$。
120120

121121
### 2.2 整数拆分
122122

0 commit comments

Comments
 (0)