剑指 Offer 60. n个骰子的点数(动态规划)

news2024/11/17 23:44:29

文章目录

  • 题目描述
  • 思路分析
  • 完整代码

题目描述

把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。
你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。

思路分析

我读完这道题愣了一会。反应了半天才看懂题。

简单说一下题目,扔1次骰子,则可能的点数,1,2 ,3,4, 5,6。每一种出现的概率就是 1/6。所以当扔骰子数n=1时,应该返回[1/6,1/6,1/6,1/6,1/6,1/6]

当n=2的时候,看下面的表。
在这里插入图片描述
其实就是统计出投骰子的总和点数,计算出这些点数的出现概率:
P (k) =k出现的次数/总次数

总次数好说,因为一共有 n 枚骰子,每枚骰子的点数都有 6 种可能出现的情况。
1次骰子是 6 ,2次骰子是6 * 6。n次就是 6的n次方。

那么现在就是求k出现的总次数了。这里的k可以理解为一个列表,这个列表里存储了n个骰子出现所有数字的和的次数。

使用动态规划来解决,找出这个列表k。

看子问题的递进过程。

当只有一个骰子n=1时候,毫无疑问,总和可能性为[1,2,3,4,5,6]
当n=2的时候,总和可能性为[2,3,4,5,6,7,8,9,10,11,12]

拿其中的总和=3举例:两个骰子出现3,意味着:

  • 第一次投1,第二次投2
  • 或者第一次投2,第二次投1。

和上一轮的投掷结果相关,显然递推关系就基本出来了。

定义dp[i][j] 表示第i次投,总和为j时,有多少种组合数。

递推公式:dp[i][j] = dp[i-1][j-1]+ dp[i-1][j-2]+ dp[i-1][j-3]… dp[i-1][j-6]

这个式子其实就是先找到上一个状态,就是不加本次骰子的所有点数和,看看那些能凑成本次需要的j,将这些可能性全部相加即可。


        for i in range(2,n+1): # 第i个骰子
            for j in range(i,6*i+1): #j表示点数和,且最大为6*i
                for k in range(1,7): # 相加所有可以组成j的情况
                    if j < k:break  # 显然在递推公式里j>k,做边界处理
                    dp[i][j] +=dp[i-1][j-k]

初始化:
将n=1的情况初始化就行了。
为了方便理解,数组下标为0时的情况作废,数组下标为1就代表n=1 就是第一次投掷的情况。

完整代码

class Solution:
    def dicesProbability(self, n: int) -> List[float]:
        # dp[i][j] 表示投掷第i次,点数和为j,的组合次数有多少个
        num_sum = 6 ** n

        dp = [[0 for _ in range(6*n+1)] for _ in range(n+1)]

        for p in range(1,7):
            dp[1][p] = 1

        for i in range(2,n+1): # 第i个骰子
            for j in range(i,6*i+1): #j表示点数最大为6*i
                for k in range(1,7):
                    if j < k:break
                    dp[i][j] +=dp[i-1][j-k]

        res = []
        for i in range(n,n*6+1):
            res.append(dp[n][i]/num_sum)
        return res
    ```

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

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

相关文章

Status 技术的兴衰:从问世到淘汰的历程

标题 Status 技术的兴衰&#xff1a;从问世到淘汰的历程摘要引言Status 问世初期优势挑战 Status 高峰期优势挑战 Status 面临挑战挑战 新兴技术的涌现优势 淘汰的原因结论 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f3fb; 《java 面试…

排污口水质的在线监测,实时掌握排口水质助力生态治理

水是生命之源&#xff0c;良好的水生态环境是社会发展的必然要求。然而随着工业化和城市化的发展&#xff0c;人类面临空气和水环境污染等严峻挑战&#xff0c;其中水环境问题尤为突出。排污成为城市和工业生产过程中不可避免的环保问题。 为加快解决生态环境突出问题&#xff…

搞科研需要具备哪些特质?

你认为科研人员需要具备哪些特质才能实现成为大科学家的梦想&#xff1f;回顾那些成功科学家的经历&#xff0c;发现他们身上总会一些共性&#xff0c;正是拥有这些共性&#xff0c;他们最后都在领域内取得了成功。那么&#xff0c;到底都具备哪些共性呢&#xff1f; 好奇心。小…

手把手教你如何挑选适合你的AI编程辅助工具

ChatGPT的普及引发了对AI应用场景的探索和实践的重大变革&#xff0c;垂直领域专业类大模型正正在不断深化落地&#xff0c;其中基于大模型专注于编码的AI工具的出现显著降低了开发的复杂性&#xff0c;提高了开发人员的开发效率&#xff0c;对初级开发人员尤其有帮助。 因此面…

面试官三连问:给我讲讲什么是索引覆盖?什么是索引下推 ? 什么是最左匹配原则 ?

1.什么是索引覆盖 索引覆盖是指在一个查询语句中&#xff0c;某个索引已经 "覆盖了" 需要被查询出来的列&#xff0c;此时就不需要进行回表查询了&#xff0c;这就叫做索引覆盖&#xff01;&#xff01;&#xff08;索引覆盖它是非聚簇索引中的一个特殊情况&#xff…

3.2.0 版本预告!远程日志解决 Worker 故障获取不到日志的问题

Apache DolphinScheduler 3.2.0 版本已经呼之欲出&#xff0c;8 月 中下旬&#xff0c;这个大版本就要和用户见面了。为了让大家提前了解到此版本更新的主要内容&#xff0c;我们已经制作了几期视频和内容做了大致介绍&#xff0c;包括《重磅预告&#xff01;Apache DolphinSch…

快递再多也不怕!你的顺丰快递用上5G“神器”

互联网时代&#xff0c;剁手党疯狂“买买买”之后&#xff0c;快递件量再创新高。《2023年6月中国快递发展指数报告》显示&#xff0c;2023二季度单月快递业务量稳定在百亿件以上。其中&#xff0c;由于“618”电商促销活动与父亲节叠加&#xff0c;6月16日至20日单日揽收量均超…

js ajax 国内快速 映像

ajax 快速 映像 https://www.bootcdn.cn/ axios入门和axios基本请求方式 https://blog.csdn.net/m0_68997646/article/details/127438174 使用 jsDelivr CDN: <script src"https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>因为我们国…

ThinkPHP6.0+ 使用Redis 原始用法

composer 安装 predis/predis 依赖&#xff0c;或者安装php_redis.dll的扩展。 我这里选择的是predis/predis 依赖。 composer require predis/predis 进入config/cache.php 配置添加redis缓存支持 示例&#xff1a; <?php// -----------------------------------------…

【文件上传】大文件分片上传、断点续传、秒传前后端实现

1、大文件上传面临的问题&#xff1a; 在传统的文件上传中&#xff0c;由于文件过大&#xff0c;导致网络传输时间长&#xff0c;这过程中会遇到网络不稳定或者不小心关闭的浏览器&#xff08;电脑&#xff09;的情况&#xff0c;从而导致文件上传中断。中断之后&#xff0c;又…

第三届OceanBase数据库大赛启动,升级为国家级竞赛

近日&#xff0c;第三届OceanBase数据库大赛启动报名。本届大赛进一步升级为全国大学生计算机系统能力大赛&#xff0c;由系统能力培养研究专家组发起&#xff0c;全国高等学校计算机教育研究会、系统能力培养研究项目发起高校主办&#xff0c;OceanBase承办&#xff0c;旨在培…

API接口开发系列,各电商(商品详情数据,商品sku数据,商品属性数据,商品优惠券数据)

API接口开发是指开发和构建应用程序之间交流的接口。主要包括设计、实现和维护接口&#xff0c;以便不同应用程序之间可以进行数据交换和相互调用功能。通过API接口开发&#xff0c;可以实现不同系统、平台或服务之间的数据交互和功能集成。 API接口开发的步骤一般包括以下几个…

程序员当累了,带爱人出去广西北海旅游下吧

先说说消费吧&#xff0c;我们一共花了8000多块钱。 两个人坐的往返机票&#xff0c;3600块钱。 上涠洲岛的船票加门票890块钱 住宿费一共4天850&#xff0c; 北海 两天350&#xff0c;涠洲岛住两天400。 路费住宿5500(200滴滴打车费) 其他消费2500 好吧&#xff0c;现在开始我…

【Apollo】Apollo 8.0系统下载指南

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

二叉树题目:二叉树的坡度

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;二叉树的坡度 出处&#xff1a;563. 二叉树的坡度 难度 3 级 题目描述 要求 给你一个二叉树的根结点 root \texttt{root} root&#xff0c;返回树…

新能源电动车交流充电桩主板技术参数

你是否知道交流充电桩主板的技术参数呢?今天我们就来了解一下。 首先&#xff0c;交流充电桩主板一般采用10V-60V电压&#xff0c;支持多种电压输入&#xff0c;比如220V、380V、400V等&#xff0c;可以满足不同用户的需求。其次&#xff0c;频率一般为50/60Hz&#xff0c;但也…

uniapp编写微信小程序遇到的坑总结

1、阻止事件冒泡 使用uniapp开发微信小程序的时候&#xff0c;发现使用click.stop来阻止事件冒泡没有作用&#xff0c;点击了之后发现仍然会触发父组件或者祖先组件的事件。 在网上查阅&#xff0c;发现使用tap.stop才能阻止事件冒泡。 2、二维码生成 在网上找了很多&…

【进程与线程】最好懂的讲解

目录 1.CPU的管理 2.进程 2.1.概述 2.2.数据结构 2.3.进程状态 2.4.进程与内存 2.5.PCB队列 3.线程 3.1.概述 3.2.实现 1.CPU的管理 进程和线程是操作系统里面的概念&#xff0c;这个概念其实是对CPU的管理策略。整个操作系统都可以看作计算机硬件的管理软件&#x…

git本地选项配置

一&#xff0c;简介 在git工具安装完成之后&#xff0c;需要设置一下常用的配置&#xff0c;如邮箱&#xff0c;缩写&#xff0c;以及git commit模板等等。本文就来详细介绍些各个配置如何操作&#xff0c;供参考。 二&#xff0c;配置步骤 2.1 查看当前git的配置 git conf…

JVM性能分析-jstat工具观察gc频率

jstat jstat是java自带的工具&#xff0c;在bin目录下 用法 语法&#xff1a;jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] [kqkyyj-2 bin]$ jstat -help Usage: jstat -help|-optionsjstat -<option> [-t] [-h&l…