你选择掷出 num 个色子,请返回所有点数总和的概率。

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

示例 1:

**输入:**num = 3
输出:[0.00463,0.01389,0.02778,0.04630,0.06944,0.09722,0.11574,0.12500,0.12500,0.11574,0.09722,0.06944,0.04630,0.02778,0.01389,0.00463]

示例 2:

**输入:**num = 5
输出:[0.00013,0.00064,0.00193,0.00450,0.00900,0.01620,0.02636,0.03922,0.05401,0.06944,0.08372,0.09452,0.10031,0.10031,0.09452,0.08372,0.06944,0.05401,0.03922,0.02636,0.01620,0.00900,0.00450,0.00193,0.00064,0.00013]

提示:

1 <= num <= 11

可以看成分别投num个色子,这样第num次的结果就与num-1次的结果强相关

dp[i]表示数字 i 出现的次数,假如我们知道第num-1次的dp结果,那么第num次的结果就是遍历上一次所有数字,对加上1到6的数字,加上原本的次数

最后再除以总情况数

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
class Solution {
public:
vector<double> statisticsProbability(int num) {
long long sum = pow6(num);
vector<long long> dp(6, 1);
for (int i = 2; i <= num; i++) {
vector<long long> tmp(5 * i + 1, 0);
for (int j = 0; j < dp.size(); j++) {
for (int k = 1; k <= 6; k++) {
tmp[j + k - 1] += dp[j];
}
}
dp = tmp;
}
vector<double> ans;
for (int i = 0; i < dp.size(); i++)
ans.push_back(dp[i] * 1.0 / sum * 1.0);
return ans;
}
long long pow6(int num) {
long long a = 6;
long long i = 1;
while (num) {
if (num % 2)
i *= a;
a *= a;
num >>= 1;
}
return i;
}
};