0
点赞
收藏
分享

微信扫一扫

剑指 Offer 60. n个骰子的点数

鱼板番茄 2022-02-04 阅读 65

题目描述:

分析:我能想到是动态规划。因为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;
    }
};
举报

相关推荐

0 条评论