【剑指 Offer 60. n个骰子的点数】
【剑指 Offer 60. n个骰子的点数】
1. 题目描述
把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。
你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。
示例 1:
输入: 1
输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]
示例 2:
输入: 2
输出: [0.02778,0.05556,0.08333,0.11111,0.13889,0.16667,0.13889,0.11111,0.08333,0.05556,0.02778]
2. 思路
动态规划:
n个骰子共有n~6*n种点数。设i个骰子点数为j的个数为dp[i][j]
则dp[i][j] = ∑k dp[i-1][j-k]
3. 代码
class Solution { public: vector<double> dicesProbability(int n) { vector<int> dp(6*n+1, 0); for(int i = 1; i <= 6; i++) { dp[i] = 1; } for(int i = 2; i <= n; i++) { for(int j = i * 6; j >= i; j--) { dp[j] = 0; for(int cur = 1; cur <= 6; cur++) { if(j - cur < i - 1) break; dp[j] += dp[j-cur]; } } } vector<double> res(5*n + 1); double base = pow(6, n); for(int i = n; i <= 6 * n; i++) { res[i - n] = (dp[i] / base); } return res; } };
一个关于dp的教程:https://mp.weixin.qq.com/s/Ef73zZv6wiaXwiJRnCLpoQ