解法:动态规划
思想:
可以把n个骰子的点数分解为n - 1个骰子的点数加上1个骰子的点数。根据1的概率数组求出2的概率数组,根据2求出3…直到求出n的点数。
●状态定义:tmp[]为n个骰子的概率数组,pre[]为n - 1个骰子的概率数组,1个骰子的概率数组显然是6个1/6
●初始状态: vectorpre = {1.0 / 6, 1.0 / 6, 1.0 / 6, 1.0 / 6, 1.0 / 6, 1.0 / 6};
●状态转移方程:tmp[x + y] += pre[x] * num[y];
num[y]这里就是1/6
复杂度:
●时间:O(N^2) 为n时需要(5 + 1) * 6 + (2 * 5 + 1) * 6 + … + (n * 5 + 1) * 6次计算,即O(N^2)
●空间: O(N^2) 5 * 1 + 1 + 5 * 2 + 1 + …+ 5 * n + 1
代码注意点:
●pre初始化时要为double,且元素为1.0/6
●第一层循环是n的迭代,从1到2到n
●第二层循环是遍历pre数组
●第三层循环是遍历6个1/6数组
代码:
class Solution {
public:
vector<double> dicesProbability(int n) {
// n为1时候的结果
vector<double>pre = {1.0 / 6, 1.0 / 6, 1.0 / 6, 1.0 / 6, 1.0 / 6, 1.0 / 6};
for(int i = 2; i <= n; ++i){
vector<double>tmp(5 * i + 1, 0); // 把骰子当成0 - 5,i个骰子范围0 - 5i,所以是5i + 1
for(int j = 0; j < pre.size(); ++j)
for(int k = 0; k < 6; ++k)
tmp[j + k] += pre[j] / 6;
pre = tmp;
}
return pre;
}
};