题目描述:
分析:我能想到是动态规划。因为3个骰子的结果肯定和2个骰子有关,然后2个骰子的结果又与1个骰子有关,但是具体的规律我觉得很麻烦,没有画图分析,所以没有找出来,就去看了看题解:
链接:https://leetcode-cn.com/problems/nge-tou-zi-de-dian-shu-lcof/solution/jian-zhi-offer-60-n-ge-tou-zi-de-dian-sh-z36d/
代码如下:
class Solution {
public:
vector<double> dicesProbability(int n) {
// f[i][j]代表i个骰子的情况下,点数和为j的概率 先全部初始化为0
double f[20][100]={0};
// 一个骰子的时候,先进行赋值
f[1][1]=1.0/6;
f[1][2]=1.0/6;
f[1][3]=1.0/6;
f[1][4]=1.0/6;
f[1][5]=1.0/6;
f[1][6]=1.0/6;
// 两个骰子以上,进行循环赋值
for(int i=2;i<=11;i++)
{
// i个骰子,点数和区间为i~6*i
for(int j=i;j<=6*i;j++)
{
// temp代表i-1个骰子时,点数为j-1、j-2、j-3、j-4、j-5、j-6时的所有概率和
double temp=0;
for(int k=1;k<=j-1&&k<=6;k++)
{
temp+=f[i-1][j-k];
}
// f[i][j]=f[i-1][j-1]*(1/6)+f[i-1][j-2]*(1/6)+f[i-1][j-3]*(1/6)+f[i-1][j-4]*(1/6)+f[i-1][j-5]*(1/6)+f[i-1][j-6]*(1/6)
f[i][j]=temp*(1.0/6);
}
}
// 结果存储在res中
vector<double> res;
// 把第n行(即共有n个骰子)的所有情况赋给res
for(int j=n;j<=6*n;j++)
res.push_back(f[n][j]);
return res;
}
};