发布于 

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

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

题目链接

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

问题描述

把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。

你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/nge-tou-zi-de-dian-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

官方解法(动态规划)

将色子分为n-1 与 1个两部分,其中单独的色子仅能骰出1-6的值,其余结果由n-1个色子骰出,通过上述递推公式,对色子的数量进行切分,直至其为1。按照上述思路构建动态规划表格。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Solution {
public double[] dicesProbability(int n) {
double res[] = new double[n*5+1];
double dp[][] = new double[n+1][n*6+1];

// 首先将1个色子出6个值的概率输出
for(int i=1;i<=6;i++){
dp[1][i] = 1.0/6;
}

// 从两个色子的情况开始考虑
for(int i=2;i<=n;i++){
// 从最小可能出现的点数i开始遍历求解 2个色子开始最小的可能出现的值就是2,最大的值就是i*6
for(int j=i;j<=i*6;j++){
// 从当前色子从1到6的情况开始考虑 将单独的色子取遍6种情况打表
for(int k=1;k<=6;k++){
// 判断当前的组合是否合法 去除无意义的解 遍历所有意义的解 将其概率求和
// 当前的j需要大于单个色子投出的值 合法性判断
if(j - k > 0)
dp[i][j] += dp[i-1][j-k]/6;
else
break;
}
}
}

// 构建返回解的形式
// 构造解的返回形式 n个色子的结果共有5n+1种,由于n个色子的点数范围是[n,6n],数量是6n-n+1 = 5n+1
for(int i=0;i<=5*n;i++){
res[i] = dp[n][n+i];
}

return res;
}
}

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本站由 @John Doe 创建,使用 Stellar 作为主题。