mirror of
https://github.com/krahets/hello-algo.git
synced 2026-04-13 17:09:46 +08:00
build
This commit is contained in:
@@ -542,7 +542,7 @@ $$
|
||||
int climbingStairsDP(int n) {
|
||||
if (n == 1 || n == 2)
|
||||
return n;
|
||||
// 初始化 dp 列表,用于存储子问题的解
|
||||
// 初始化 dp 表,用于存储子问题的解
|
||||
int[] dp = new int[n + 1];
|
||||
// 初始状态:预设最小子问题的解
|
||||
dp[1] = 1;
|
||||
@@ -562,7 +562,7 @@ $$
|
||||
int climbingStairsDP(int n) {
|
||||
if (n == 1 || n == 2)
|
||||
return n;
|
||||
// 初始化 dp 列表,用于存储子问题的解
|
||||
// 初始化 dp 表,用于存储子问题的解
|
||||
vector<int> dp(n + 1);
|
||||
// 初始状态:预设最小子问题的解
|
||||
dp[1] = 1;
|
||||
@@ -582,7 +582,7 @@ $$
|
||||
"""爬楼梯:动态规划"""
|
||||
if n == 1 or n == 2:
|
||||
return n
|
||||
# 初始化 dp 列表,用于存储子问题的解
|
||||
# 初始化 dp 表,用于存储子问题的解
|
||||
dp = [0] * (n + 1)
|
||||
# 初始状态:预设最小子问题的解
|
||||
dp[1], dp[2] = 1, 2
|
||||
@@ -623,7 +623,7 @@ $$
|
||||
int climbingStairsDP(int n) {
|
||||
if (n == 1 || n == 2)
|
||||
return n;
|
||||
// 初始化 dp 列表,用于存储子问题的解
|
||||
// 初始化 dp 表,用于存储子问题的解
|
||||
int[] dp = new int[n + 1];
|
||||
// 初始状态:预设最小子问题的解
|
||||
dp[1] = 1;
|
||||
@@ -656,7 +656,7 @@ $$
|
||||
|
||||
与回溯算法一样,动态规划也使用“状态”概念来表示问题求解的某个特定阶段,每个状态都对应一个子问题以及相应的局部最优解。例如对于爬楼梯问题,状态定义为当前所在楼梯阶数 $i$ 。**动态规划的常用术语包括**:
|
||||
|
||||
- 将 $dp$ 数组称为「状态列表」,$dp[i]$ 代表第 $i$ 个状态的解;
|
||||
- 将数组 `dp` 称为「$dp$ 表」,$dp[i]$ 表示状态 $i$ 对应子问题的解;
|
||||
- 将最小子问题对应的状态(即第 $1$ , $2$ 阶楼梯)称为「初始状态」;
|
||||
- 将递推公式 $dp[i] = dp[i-1] + dp[i-2]$ 称为「状态转移方程」;
|
||||
|
||||
@@ -664,7 +664,7 @@ $$
|
||||
|
||||
<p align="center"> Fig. 爬楼梯的动态规划过程 </p>
|
||||
|
||||
细心的你可能发现,**由于 $dp[i]$ 只与 $dp[i-1]$ 和 $dp[i-2]$ 有关,因此我们无需使用一个数组 `dp` 来存储所有状态**,而只需两个变量滚动前进即可。如以下代码所示,由于省去了数组 `dp` 占用的空间,因此空间复杂度从 $O(n)$ 降低至 $O(1)$ 。
|
||||
细心的你可能发现,**由于 $dp[i]$ 只与 $dp[i-1]$ 和 $dp[i-2]$ 有关,因此我们无需使用一个数组 `dp` 来存储所有子问题的解**,而只需两个变量滚动前进即可。如以下代码所示,由于省去了数组 `dp` 占用的空间,因此空间复杂度从 $O(n)$ 降低至 $O(1)$ 。
|
||||
|
||||
=== "Java"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user