剑指 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]; for(int i=1;i<=6;i++){ dp[1][i] = 1.0/6; }
for(int i=2;i<=n;i++){ for(int j=i;j<=i*6;j++){ for(int k=1;k<=6;k++){ if(j - k > 0) dp[i][j] += dp[i-1][j-k]/6; else break; } } } for(int i=0;i<=5*n;i++){ res[i] = dp[n][n+i]; }
return res; } }
|