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


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

    把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]

    限制:

    1 <= n <= 11

    解析:

    dp[i][j]表示i个骰子,和为j的情况数

    则dp[i][j] = sum(dp[i - 1][j - k])   其中k 属于[1, j - 1]

    class Solution {
    public:
        vector<double> dicesProbability(int n) {
            vector<double> res(n * 6 - n + 1);
            //> dp[i][j]: i - 1个骰子,点数和为 j 的情况的数量
            vector<vector<int>> dp(n + 1, vector<int>(n * 6 + 1, 0));
            //> 初始化 dp[1][i] = 1;
            //> 1个骰子,点数和为[1,6]的情况只有一种
            for (int i = 1; i <= 6; ++i)
            {
                dp[1][i] = 1;
            }
    
            //> 遍历顺序:第2个骰子 ---> 第n个骰子
            for (int i = 2; i <= n; ++i)
            {
                //> j 为i个骰子的点数和情况
                for (int j = i; j <= 6 * n; ++j)
                {
                    for (int k = 1; k <= 6; ++k)
                    {
                    if(j-k > 0)  
                        dp[i][j] += dp[i-1][j-k];
                    else 
                       break;
                    }
                }
            }
            double denominator = pow(6.0, n);
    
            for (int i = n,index = 0; i <= 6*n; ++i)
            {
                res[index++] = dp[n][i] / denominator;
            }
            return res;
        }
    };
  • 相关阅读:
    GO学习-(31) Go语言操作Elasticsearch
    GO学习-(30) Go语言操作kafka
    GO学习-(29) Go语言操作etcd
    Maven+Spring打Jar包
    话说Session
    Apache Server与多个独立Tomcat集成
    一套Tomcat处理多个域名请求
    Tomcat多实例
    Linux下安装MySQL
    Java Enum
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/16530333.html
Copyright © 2020-2023  润新知