Poison

剑指 Offer 60. n个骰子的点数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public double[] dicesProbability(int n) {
// 定义 dp[i][j] 为 i 个骰子时点数之和为 j 时的概率
double[][] dp = new double[n + 1][6 * n + 1];
dp[1][1] = dp[1][2] = dp[1][3] = dp[1][4] = dp[1][5] = dp[1][6] = 1.0 / 6;

for (int i = 2; i <= n; i++) {
// 注意 j 的取值范围为 [i, 6 * i]
for (int j = i; j <= 6 * i; j++) {
for (int k = 1; k <= 6; k++) {
if (j - k > 0) {
dp[i][j] += dp[i - 1][j - k] * 1 / 6; // 上一个骰子点数为 j - k 时贡献的概率
}
}
}
}

double[] res = new double[6 * n - n + 1];
for (int i = n; i <= 6 * n; i++) {
res[i - n] = dp[n][i];
}
return res;
}
}
Reference

剑指 Offer 60. n个骰子的点数