diff --git a/notes/60. n 个骰子的点数.md b/notes/60. n 个骰子的点数.md index 5e525cd3..713fbf4a 100644 --- a/notes/60. n 个骰子的点数.md +++ b/notes/60. n 个骰子的点数.md @@ -12,7 +12,7 @@ ### 动态规划 -使用一个二维数组 dp 存储点数出现的次数,其中 dp\[i]\[j] 表示前 i 个骰子产生点数 j 的次数。 +使用一个二维数组 dp 存储点数出现的次数,其中 dp\[i]\[j] 表示前 i 个骰子产生点数 j 的次数。第 i 个骰子掷出 k(1~6)时,前 i - 1 个骰子的点数和要为 j - k,因此 dp\[i]\[j] 等于 dp\[i - 1]\[j - k] 对 k = 1~6 求和,最后除以 6n 得到概率。

@@ -41,9 +41,9 @@ public double[] statisticsProbability(int num) { } ``` -### 动态规划 + 旋转数组 +### 动态规划 + 滚动数组 -空间复杂度:O(N) +第 i 行只依赖第 i - 1 行,用两行交替使用即可。空间复杂度:O(N) ```java public double[] statisticsProbability(int num) { @@ -54,10 +54,10 @@ public double[] statisticsProbability(int num) { for (int i = 1; i <= face; i++) dp[0][i] = 1; - int flag = 1; /* 旋转标记 */ + int flag = 1; /* 当前行 */ for (int i = 2; i <= num; i++, flag = 1 - flag) { for (int j = 0; j <= pointNum; j++) - dp[flag][j] = 0; /* 旋转数组清零 */ + dp[flag][j] = 0; /* 当前行清零 */ for (int j = i; j <= pointNum; j++) for (int k = 1; k <= face && k <= j; k++)