剑指offer--c++--n个骰子的点数

目录

题目:

题目分析:

最后编写代码:

输出结果


题目:


          把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。

感谢大佬的帮助:https://www.cnblogs.com/wangkundentisy/p/9378886.html

题目分析:

       这是一题典型的DP问题。

    1. 首先分析是否是DP问题,得满足两个条件:1.最优子结构;2.重叠子问题。

       第n个骰子的点数实际上是在n-1这堆骰子的基础上进行的投掷。满足最优子结构

       求父问题的时候多次用到子问题,想要解决第n个骰子的问题,需要前面的数据。满足重叠子问题

    2.确定是DP问题之后,需要确定状态转移方程。

      分析一下,第n个骰子的点数之和是与前面n-1那堆骰子的点数之和相关。其实情况还算蛮复杂的,光想是想不出来的,我们根据色子的投掷情况,列了下面表格,根据观察我们发现状态转换方程。我们不妨设f(n,k) = f(n-1,k-1) + f(n-1,k-2) + f(n-1,k-3) + f(n-1,k-4) + f(n-1,k-5) + f(n-1,k-6) ;这里n代表色子个数,k代表点数之和,f(n,k)代表n个色子投掷,点数之和为k的所有投掷次数。仔细想一下,第n个骰子投掷完之后的点数之和是不是等于上一次投掷点数次数之和,因为上一次有六种投法,所以要将这六种的可能次数都加起来。

   3.在建立完状态方程之后,考虑将状态方程初始化,第一次投掷,1~6点数各自出现的次数都为1次吧,所以都初始化为1。

最后编写代码:

#include<iostream>
#include<math.h>
#include<vector>
using namespace std;class Solution {
public:vector<double> twoSum(int n) {vector<double> res;vector<vector<int> > dp(n + 1, vector<int>(n * 6 + 1, 0));//初始化for (int i = 1; i <= 6; i++){dp[1][i] = 1;}//填表int sum = 0;for (int i = 2; i <= n; i++){for (int j = i; j <= n * 6; j++){for (int k = 1; k <= 6; k++){if ((j - k) >= 0)//这里防止数组越界,看表就知道,数组会越界的dp[i][j] += dp[i - 1][j - k];elsebreak;}if (i == n){sum += dp[i][j];//直接计算n个色子投掷所有可能出现的次数总和}}}if (n == 1)sum = 6;for (int i = n; i <= n * 6; i++){res.push_back((double)dp[n][i] / sum);//用于计算概率,别忘记强制转换成double}return res;}
};
int main()
{Solution solution;vector<double> result = solution.twoSum(6);for (int j = 0; j <= result.size() - 1; j++){std::cout << result[j] << " ";}std::cout << "" << std::endl;return 0;
}

输出结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/518844.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Deeplearning4j【基础 01】初识Java深度学习框架DL4J

初识Java深度学习框架DL4J 1.起因2.简介3.组件3.1 Deeplearning4j/ScalNet3.1.1 Deeplearning4jf&#xff08;Java&#xff09;3.1.2 ScalNet&#xff08;Scala&#xff09; 3.2 ND4J/LibND4J3.3 SameDiff3.4 DataVec3.5 Arbiter3.6 RL4J 4.总结 内容来自网络&#xff0c;基于官…

7.1 支付模块 - 用户选课

支付模块 - 需求分析、添加选课 文章目录 支付模块 - 需求分析、添加选课一、需求分析1.1 选课业务流程1.2 支付业务流程1.3 在线学习业务流程1.4 课程续期业务流程 二、添加选课2.1 执行流程2.2 数据模型2.2.1 选课记录表 choose_course2.2.2 用户课程表 course_tables 2.3 查…

R语言lavaan结构方程模型在复杂网络分析中的科研技术新趋势

此外&#xff0c;我们还将深入探讨R语言的基础知识、结构方程模型的基本原理、lavaan程序包的使用方法等内容。无论是潜变量分析、复合变量分析&#xff0c;还是非线性/非正态/缺失数据处理、分类变量分析、分组数据处理等复杂问题&#xff0c;我们都将一一为您解析。 希望通过…

线程安全之死锁

目录 一、概念 二、例子 三、死锁相关面试题目 一、概念 死锁主要发生在有多个依赖锁存在时,会在一个线程试图以另一个线程相反顺序锁住互斥量时发生 死锁使得一个或多个线程被挂起而无法继续执行,最糟糕的是,这种情况还不容易被发现。 在一个线程中对一个已经加锁的普通锁…

springboot-整合mybatis

1.导入依赖 <!--整合mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version></dependency><!--mysql--><dependen…

为什么不从独立服务器中转向云或其他方案呢?

传统的专用服务器&#xff0c;如香港服务器租赁、重庆服务器租赁等&#xff0c;是最强大、最稳定的业务托管类型之一。您将获得比任何其他托管计划更多的管理权限和卓越的性能&#xff0c;并且您可以控制整个服务器上的几乎所有内容。 当然&#xff0c;专用服务器也是在线业务…

多线程:线程池

线程池 认识线程池 什么是线程池 线程池就是一个可以复用线程的技术。 不使用线程池的问题 用户每发起一个请求&#xff0c;后台就需要创建一个新线程来处理&#xff0c;下次新任务来了肯定又要创建新线程处理的&#xff0c;而创建新线程的开销是很大的&#xff0c;并且请…

蜻蜓FM语音下载(mediadown)

一、介绍 蜻蜓FM语音下载&#xff08;mediadown&#xff09;&#xff0c;能够帮助你下载蜻蜓FM音频节目。如果你是蜻蜓FM会员&#xff0c;它还能帮你下载会员节目。 二、下载地址 本站下载&#xff1a;蜻蜓FM语音下载&#xff08;mediadown&#xff09; 百度网盘下载&#…

爬虫入门到精通_框架篇15(Scrapy框架安装)

1 Scrapy安装 Scrapy的安装有多种方式&#xff0c;它支持Python2.7版本及以上或Python3.3版本及以上。下面说明Python3环境下的安装。 Scrapy依赖的库比较多&#xff0c;至少需要依赖库有Twisted14.0,lxml 3.4,pyOpenSSL 0.14。而在不同平台环境又各不相同&#xff0c;所以在安…

【Flutter 面试题】dart是值传递还是引用传递?

【Flutter 面试题】dart是值传递还是引用传递&#xff1f; 文章目录 写在前面解答补充说明值传递示例引用传递示例总结 写在前面 关于我 &#xff0c;小雨青年 &#x1f449; CSDN博客专家&#xff0c;GitChat专栏作者&#xff0c;阿里云社区专家博主&#xff0c;51CTO专家博主…

视频编码中常用的测试YUV系列及说明

vcc最新规定的测试序列如下所示&#xff0c;对于RA和LD配置&#xff0c;所有序列的所有帧都需要测试&#xff0c;对于intra配置仅需测试前8帧。 每列含义如下&#xff1a; A1、A2测试序列在LD配置下编码时应编码帧数为帧率的三倍。 “M”表示在该配置下必须测试这条序列。 …

算法沉淀——动态规划之其它背包问题与卡特兰数(leetcode真题剖析)

算法沉淀——动态规划之其它背包问题与卡特兰数 二维费用的背包问题01.一和零02.盈利计划 似包非包组合总和 Ⅳ 卡特兰数不同的二叉搜索树 二维费用的背包问题 01.一和零 题目链接&#xff1a;https://leetcode.cn/problems/ones-and-zeroes/ 给你一个二进制字符串数组 strs…