解题思路;
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;
}
}
该博客介绍了如何使用动态规划解决《剑指Offer》中第60题——n个骰子的点数问题。通过建立二维数组dp,计算每个骰子个数i和点数j的概率,最终得出所有可能点数的概率分布。博客内容详细解释了状态转移方程,并给出了Java代码实现,展示了动态规划在解决概率计算问题上的应用。


1303

被折叠的 条评论
为什么被折叠?



