解题思路;
dp[i][j]:
表示i
个骰子时, 摇到和为j
的概率
k:
表示摇到骰子的点数
dp[1][k]:
表示一个骰子时, 可能会摇到和为1, 2, 3, 4, 5, 6
, 所以k
取1~6
, 被摇到的点数概率都为1/6
dp[i - 1][j - k]:
表示当i
个骰子里就减去一个的时候, 摇到的和就为j - k
从而可以得dp[i][j] = dp[i - 1][j - k]*dp[1][k]
当有n
个骰子时:
骰子和的取值范围: [n, 6n]
骰子和出现的种类: 6n - n + 1 = 5n + 1
例如: 有两个骰子
和: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
可以从上观察得: 和出现的种类为 11 种
class Solution {
public double[] dicesProbability(int n) {
if(n <= 0) return new double[0];
double[][] dp = new double[n + 1][6 * n + 1];
for(int i = 1; i <= 6; i++){
dp[1][i] = (double) 1 / 6;
}
//i表示骰子个数
//j表示骰子和
//k取值是1 ~ 6
for(int i = 2; i <= n; i++){
int maxValue = 6 * i;
for(int j = i; j <= maxValue; j++){
for(int k = 1; k <= 6; k++){
if(j - k <= 0){
continue;
}
dp[i][j] += dp[1][k] * dp[i - 1][j - k];
}
}
}
double[] res = new double[5 * n + 1];
int value = n;
for(int i = 0; i < res.length; i++){
res[i] = dp[n][value++];
}
return res;
}
}