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

news2024/9/24 9:23:07

目录

题目:

题目分析:

最后编写代码:

输出结果


题目:


          把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];
                    else
                        break;
                }
                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.coloradmin.cn/o/1491404.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java面试(消息队列MQ)

MQ有什么用&#xff1f;有哪些场景&#xff1f; MQ&#xff08;MessageQueue&#xff09;消息队列。队列&#xff08;FIFO&#xff09;先进先出的数据结构&#xff0c;消息由生产者发送到MQ&#xff0c;后由消费者对消息进行处理。QQ&#xff0c;微信就是MQ场景。 MQ作用&…

第七个程序:两个字符串连接后计算长度

实验步骤; 第一步&#xff1a;新建项目 第二步&#xff1a;程序编写 第三步&#xff1a;运行结果 Labview一共7个字节&#xff0c;长度为7&#xff0c;一个字母一个字节 汉字为2个字节&#xff0c;图一为4&#xff0c;图二为8 所以结果分别为11和15 视频教学&#xff1a; 字…

Android开发技术总结,附项目源码

今天本文主要讲解&#xff1a; APK文件反编译 什么是反编译如何防止反编译APK文件的基本构造 APK加固的方案原理 APK加固总体架构APK打包基本流程Dex文件的意义 AES加密项目实战 APK加固项目实战APK脱壳技术实战 一.APK文件反编译 1.什么是反编译 定义&#xff1a; 利用…

一次电脑感染Synaptics Pointing Device Driver病毒的经历,分享下经验

没想到作为使用电脑多年的老司机也会电脑中病毒&#xff0c;周末玩电脑的时候突然电脑很卡&#xff0c;然后自动重启&#xff0c;奇怪&#xff0c;之前没出现这个情况。 重启后电脑开机等了几十秒&#xff0c;打开任务管理器查看开机进程&#xff0c;果然发现有个Synaptics Po…

【ICM】好奇心机制

文章目录 样本经验处理降低图片像素和通道构建连续状态捕捉动作经验回放类 各部分的模型编码器模型反向模型正向模型DQN模型ICM 的 反向传播 概念补充强化学习组成元素按照学习目标来分按照策略更新方式区分强化学习on-line 与 off-line经验回放 全部代码 样本经验处理 降低图…

代码随想录 二叉树第五周

目录 235.二叉搜索树的最近公共祖先 701.二叉搜索树的插入操作 450.删除二叉搜索树中的节点 669.修建二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 235.二叉搜索树的最近公共祖先 235. 二叉搜索树的最近公共祖先 中等 给定一个二叉搜索树,…

“声震四方,贼人退散;平安守护,行者无忧。”#STM32项目一 《电动车报警器》

“声震四方&#xff0c;贼人退散&#xff1b;平安守护&#xff0c;行者无忧。”#STM32项目一 电动车报警器 前言预备知识1.电动车报警器项目概述1.1项目需求1.2项目框图1.3.硬件清单 2.振动传感器介绍及实战2.1振动传感器介绍2.2振动传感器接线2.3使用STM32CubeMX建立工程2.4程…

Spring 类型转换、数值绑定与验证(三)— Formatting 与 Validation

1 Formatting 在Spring中用于格式化数据及根据地域展示不同格式的数据。 图 Formatting接口 UML 1.1 注解驱动Formatting 自定义像“DateTimeFormat”注解来对相关字段格式化的步骤为&#xff1a; 自定义注解。定义一个实现AnnotationFormatterFactory接口的工厂类。往容器…

亚马逊卖家做市场分析业务可以用静态IP代理完成吗?

亚马逊作为全球最大的电商平台之一&#xff0c;其庞大的销售数据和用户行为数据成为了许多商家和市场研究人员进行市场分析和竞争研究的重要来源。而使用IP代理则能够为亚马逊市场分析带来许多帮助&#xff0c;下面就来一一介绍。静态IP代理可以为市场分析带来哪些帮助&#xf…

DatasetsDataLoader

PyTorch 提供了两个数据基类&#xff1a; torch.utils.data.DataLoader 和 torch.utils.data.Dataset。允许你使用预加载的数据集以及你自己的数据集。 Dataset 存储样本和它们相应的标签&#xff0c;DataLoader 在 Dataset 基础上添加了一个迭代器&#xff0c;迭代器可以迭代数…

【Java JVM】对象回收判断

Java 对象回收判断是程序设计中至关重要的一环。在面向对象的编程中, 合理的对象回收策略直接影响着程序的性能和内存利用效率。 因此, 深入了解和准确判断 Java 对象的回收时机, 不仅可以优化程序的运行性能, 还能有效避免内存泄漏和资源浪费。 本文将简单的分析一下 JVM 中对…

Java递归生成本地文件目录树形结构

Java递归生成本地文件目录(树行结构) 1.读取txt文件保存的文件目录结构 2.递归生成本地文件目录树形结构&#xff0c;并修改目录文件前缀进行递增 3.结果截图 4.代码 package com.zfi.server.device;import io.swagger.annotations.Api; import org.springframework.web.bind…

springcloud:3.2测试超时机制

服务提供者 Openfeign远程调用服务提供者搭建 文章地址http://t.csdnimg.cn/06iz8 PaymentController【控制层】 /*** 测试超时机制** return*/GetMapping("/timeout")public String TimeOut() {try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {…

win11下安装mysql

一、下载MySQL 官方下载传送门 我安装的版本是5.7.83 二、安装MySQL 1.双击安装包 2.选择Custom(自定义安装)&#xff0c;然后Next> 3.根据你的系统做选择&#xff0c;我的是64位&#xff0c;所选MySQL Servers 5.7.38 -x64&#xff0c;然后按箭头将选中的版本移到右边…

android开发工具,美团安卓面试

1、java中和equals和hashCode的区别 基本数据类型的比较的值相等. 类的比较的内存的地址&#xff0c;即是否是同一个对象&#xff0c;在不覆盖equals的情况下&#xff0c;同比较内存地址&#xff0c;原实现也为 &#xff0c;如String等重写了equals方法. hashCode也是Object类…

电子设备内幕:RAM和ROM小百科

大家好&#xff0c;我是知微。 在智能手机出现之前&#xff0c;大家对RAM和ROM这两个词都没什么概念。如今很多手机在宣传的时候&#xff0c;都会标明有多大的RAM(运行内存)和ROM(存储空间)&#xff0c;因为这在很大程度上影响手机的使用流畅度和使用寿命。 其实&#xff0c;…

【ONE·基础算法 || 双指针】

总言 主要内容&#xff1a;编程题举例&#xff0c;理解双指针思想。       文章目录 总言1、双指针2、零移动&#xff08;easy&#xff09;2.1、思路分析2.2、题解 3、复写零&#xff08;easy&#xff09;3.1、题解 4、快乐数&#xff08;medium&#xff09;4.1、思路分析4…

82407太赫兹扩频模块系列

82407太赫兹扩频模块系列 简述&#xff1a; 82407扩频模块系列产品主要为信号/频谱分析仪进行毫米波扩频测量而设计。该系列扩频模块还可用作毫米波信号接收机的前端。 82407扩频模块系列输入接口采用相应频段的标准矩形波导&#xff0c;其中82407/NB/A/B/C/D小型化产品本振输…

安装算法依赖时版本报错,依赖之间对应版本

困惑了很久&#xff0c;毕竟不是计算机专业专业出身&#xff0c;才知道安装深度学习算法各个依赖之间是有版本对应关系的。 &#xff08;本文使我随笔记录&#xff0c;无价值&#xff09; 比如&#xff1a; 再比如&#xff1a; 由于我第一步安装cuda时就和其他博主不一致&…

仓储仓库广播-仓储仓库无线应急广播对讲智能管理系统建设重点解析

仓储仓库广播-仓储仓库无线应急广播对讲智能管理系统建设重点解析 北京海特伟业科技有限公司任洪卓发表于 2024年3月5日 一、仓储仓库无线应急对讲广播系统客户需求 中央储备粮北京某某直属库&#xff0c;为国有粮食仓储企业&#xff0c;具备30多个粮食储备仓和8个成品油储备…