Update 60. n 个骰子的点数.md

补充动态规划解法的状态转移与概率计算说明;调整滚动数组小节标题、空间优化说明及相关代码注释。
This commit is contained in:
CyC2018
2026-10-30 20:18:07 +08:00
parent b866303d73
commit 6f12d532f0
+5 -5
View File
@@ -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 求和,最后除以 6<sup>n</sup> 得到概率。
<div align="center"> <img src="pics/offer-dice-sum.png" width="560px"/> </div><br>
@@ -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++)