剑指Offer60.n个骰子的点数 C++

这篇具有很好参考价值的文章主要介绍了剑指Offer60.n个骰子的点数 C++。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、题目描述

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

2、VS2019上运行

使用Krahets—动态规划

#include <iostream>
#include <vector>

using namespace std;

class Solution {
public:
    vector<double> dicesProbability(int n) {
        vector<double> dp(6, 1.0 / 6.0); // 初始化一个大小为6的vector,初始值为骰子点数为1到6的概率

        for (int i = 2; i <= n; i++) {
            //6 * i - i + 1 = 5 * i + 1;  6 * i是最大点数和,i是最小点数和,相减+1是点数和的范围
            vector<double> tmp(5 * i + 1, 0); // 创建一个临时的vector,用于存储更新后的概率
            for (int j = 0; j < dp.size(); j++) {
                for (int k = 0; k < 6; k++) {//k是骰子的点数
                    tmp[j + k] += dp[j] / 6.0; // 更新临时vector中点数和为j+k的概率
                }
            }
            dp = tmp; // 将临时vector赋值给dp,更新当前骰子数量下的概率分布
        }
        return dp;
    }
};

int main() {
    Solution solution;
    int n;
    cout << "请输入骰子的数量:";
    cin >> n;

    vector<double> result = solution.dicesProbability(n);

    cout << "每个点数和的概率:" << endl;
    for (int i = 0; i < result.size(); i++) {
        cout << "点数和 " << i + n << ":" << result[i] << endl;
    }

    return 0;
}

请输入骰子的数量:2
每个点数和的概率:
点数和 2:0.0277778
点数和 3:0.0555556
点数和 4:0.0833333
点数和 5:0.111111
点数和 6:0.138889
点数和 7:0.166667
点数和 8:0.138889
点数和 9:0.111111
点数和 10:0.0833333
点数和 11:0.0555556
点数和 12:0.0277778

3、解题思路

Krahets文章来源地址https://www.toymoban.com/news/detail-670940.html

  • 算法首先初始化一个长度为6的概率向量dp,初始时每个点数的概率均为1/6,这是因为在投掷一个骰子时,每个点数出现的概率都是相同的。
  • 然后,从第2个骰子开始,进行n次循环。在每次循环中,创建一个长度为5*i+1的临时概率向量tmp,用于存储投掷当前骰子后的点数和概率分布。
  • 通过两层嵌套循环,遍历当前的概率向量dp中的每个点数和概率值。对于每个点数和,内层循环遍历骰子的点数1到6,并将当前点数和的概率均匀分配到所有可能的下一个点数和上。
  • 最后,将临时概率向量tmp赋值给dp,以便进行下一次循环。这样,当循环结束时,dp中的概率分布就表示了投掷n次骰子后各种点数和出现的概率。
  • 最后,将dp作为结果返回。

到了这里,关于剑指Offer60.n个骰子的点数 C++的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 剑指Offer题集(力扣)

    难度简单1155 找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 示例 1: 限制: 方法一:哈希 方法二:原地交

    2024年02月03日
    浏览(27)
  • leetcode(力扣) 剑指 Offer 12. 矩阵中的路径(回溯 DFS)

    给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

    2024年02月14日
    浏览(35)
  • 剑指offer(C++)-JZ49:丑数(算法-其他)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺

    2024年02月03日
    浏览(36)
  • 剑指Offer12.矩阵中的路径 C++

    给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

    2024年02月14日
    浏览(26)
  • 剑指offer:关于二叉树的汇总(c++)

    1、重建二叉树: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 2、树的子结构: 输入两棵二叉树A和B,

    2023年04月12日
    浏览(38)
  • 剑指Offer13.机器人的运动范围 C++

    地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+

    2024年02月10日
    浏览(27)
  • 剑指offer(C++)-JZ29:顺时针打印矩阵(算法-模拟)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 则依次打印出数字 数据范围: 0 = matrix.length = 100 0 = ma

    2024年02月10日
    浏览(32)
  • 力扣256.翻转二叉树(递归/qBFS) 剑指offer 32 从上到下打印二叉树(q BFS)I II III(三道题)

    采用队列 采用递归 第一个需要考虑的问题是 二维数组怎样在不知道行和列的情况下进行插入 :先定义一维数组,然后将一维数组插入二维数组! 第二个需要考虑的问题是 BFS中队列进行遍历每一层的时候既需要把当前结点的左右孩子结点存到队列里,同时当前层结束后 原来

    2024年02月16日
    浏览(30)
  • 剑指offer(C++)-JZ47:礼物的最大价值(算法-动态规划)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 在一个mtimes nm×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向

    2024年02月05日
    浏览(52)
  • 剑指offer(C++)-JZ12:矩阵中的路径(算法-回溯)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 请设计一个函数,用来判断在一个n乘m的矩阵中是否存在一条包含某长度为len的字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以

    2024年02月11日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包