一文解决投骰子类的算法题

目录

首先来看一道经典的问题:n个骰子的点数

我们再来看另一个问题:掷骰子的N种方法


牢记投骰子类问题的解决方法:动态规划

首先来看一道经典的问题:n个骰子的点数

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

示例 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]

预备知识

给定 n 个骰子,可得:

  • 每个骰子摇到 1 至 6 的概率相等,都为 \frac{1}{6} 。

  • 将每个骰子的点数看作独立情况,共有 6^{n} 种「点数组合」。例如 n = 2 时的点数组合为:

(1,1), (1,2), ... , (2, 1), (2, 2), ... , (6,1), ... , (6, 6)

  • n 个骰子「点数和」的范围为 [n, 6n],数量为 5n+1 种。

        设输入 n 个骰子的解(即概率列表)为 f(n) ,其中「点数和」 x 的概率为 f(n, x)。 

        当添加骰子的点数为 1 时,前 n - 1 个骰子的点数和应为 x - 1,方可组成点数和 x ;同理,当此骰子为 2 时,前 n - 1 个骰子应为 x - 2 ;以此类推,直至此骰子点数为 6 。将这 6 种情况的概率相加,即可得到概率 f(n, x)。递推公式如下所示:

f(n,x)=\sum_{i=1}^{6}f(n-1,x-i)*\frac{1}{6}

        根据以上分析,得知通过子问题的解 f(n - 1)可递推计算出 f(n),而输入一个骰子的解 f(1) 已知,因此可通过解 f(1) 依次递推出任意解 f(n) 。         

Picture2.png

        观察发现,以上递推公式虽然可行,但 f(n - 1, x - i) 中的 x - i 会有越界问题。例如,若希望递推计算 f(2, 2) ,由于一个骰子的点数和范围为 [1, 6] ,因此只应求和 f(1, 1) ,即 f(1, 0) , f(1, -1) , ... , f(1, -4) 皆无意义。此越界问题导致代码编写的难度提升。

        所以为了计算 f(n, x) ,将所有与之有关的情况求和;而倘若改换为 “正向” 的递推公式,便可解决越界问题。

逆向递推(有越界问题):为求f(n,x),将f(n-1)中所有与其有关的概率项求和。

正向递推(无越界问题):遍历f(n-1),统计每项f(n-1,i)对概率f(n,i+1),f(n,i+2),...,f(n,i+6)产生的贡献。

        具体来看,由于新增骰子的点数只可能为 1 至 6 ,因此概率 f(n - 1, x) 仅与 f(n, x + 1) , f(n, x + 2), ... , f(n, x + 6) 相关。因而,遍历 f(n - 1) 中各点数和的概率,并将其相加至 f(n) 中所有相关项,即可完成 f(n - 1) 至 f(n) 的递推。 

        通常做法是声明一个二维数组 dp ,dp[i][j] 代表前 i 个骰子的点数和 j 的概率,并执行状态转移。而由于 dp[i] 仅由 dp[i-1] 递推得出,为降低空间复杂度,只建立两个一维组 dp , tmp 交替前进即可。


我们再来看另一个问题:掷骰子的N种方法

题目:这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, ..., f

我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和。

如果需要掷出的总点数为 target,请你计算出有多少种不同的组合情况(所有的组合情况总共有 f^d 种),模 10^9 + 7 后返回。

示例 1:

输入:d = 1, f = 6, target = 3
输出:1

示例 2:

输入:d = 2, f = 6, target = 7
输出:6

示例 3:

输入:d = 2, f = 5, target = 10
输出:1

        这道题的处理方法其实和上一道题一样,只是做了稍微的变通。

        首先我们定义 dp[i][j] 代表投掷 i 个骰子和为 j。而dp[i][j] 和 dp[i-1] 的关系是,当第 i 次我投的点数为k(1<= k <= f),那么前 i-1次和为 j-k,对应的是 dp[i-1][j-k]。

        那么最终就有 dp[i][j] = dp[i-1][j-1] + dp[i-1][j-2] + ... + dp[i-1][j-f];

 

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

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

相关文章

21天经典算法之冒泡排序

​ ​ 活动地址&#xff1a;CSDN21天学习挑战赛 专栏前言: 本专栏主要是算法训练&#xff0c;目的很简单。就是为了进厂 最近官方在组织 21 天挑战赛&#xff0c;趁此机会我也更新一下经典算法的文章 如果想一起“狂”或者交流&#xff0c;欢迎来私聊 还不快趁着这个机会来提升…

鸡尾酒排序算法详解

一、什么是鸡尾酒排序 1.概念 鸡尾酒排序算法又叫快乐小时排序&#xff0c;它基于冒泡排序算法做了一些优化。冒泡排序算法每一轮都是从左到右进行元素比较&#xff0c;进行单向的位置交换&#xff0c;鸡尾酒排序算法则是双向的元素比较和交换。 2.算法原理 这是一个无序数…

【1072】鸡尾酒疗法

1072&#xff1a;鸡尾酒疗法 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 62913 通过数: 27350 【题目描述】 鸡尾酒疗法&#xff0c;指“高效抗逆转录病毒治疗”。人们在鸡尾酒疗法的基础上又提出了很多种改进的疗法。为了验证这些治疗方法是否在疗效上比鸡尾…

把psd自动生成html,根据psd文件生成html

我是新手&#xff0c;怎样在ps中把psd文件变成html文件呢&#xff1f;我知道要用切片&#xff0c;但是具体步骤怎么做&#xff0c;还有是不是不同的ps版本有差异 不同的ps版本是没有什么差异的&#xff0c;主要用到的就是工具里面的切片&#xff0c;用切片切好图后&#xff0c;…

为什么不要相信AI机器人提供的健康信息?

自从OpenAI、微软和谷歌推出了AI聊天机器人&#xff0c;许多人开始尝试一种新的互联网搜索方式&#xff1a;与一个模型进行对话&#xff0c;而它从整个网络上学到的知识。 专家表示&#xff0c;鉴于之前我们倾向于通过搜索引擎查询健康问题&#xff0c;我们也不可避免地会向Ch…

OpenAI 用于辅助治疗的 GPT-4:AI 如何彻底改变心理健康护理

人工智能&#xff08;AI&#xff09;改变了我们生活的方方面面&#xff0c;从娱乐和教育到医疗保健。人工智能最有前途的应用之一是在心理健康领域&#xff0c;它可以帮助数百万患有抑郁症、焦虑症、创伤后应激障碍 &#xff08;PTSD&#xff09; 和物质使用障碍等各种疾病的人…

大模型惨遭人类大范围攻击!国内各领域专家组团投毒,GPT-4也Hold不住

包括GPT-4在内等多个大模型惨遭人类攻击&#xff01;还是大范围、多边形那种。 而且这个军团被爆个个来头不小。 包括社会学家李银河、心理学家李松蔚、中科院计算研究所王元卓等&#xff0c;覆盖环境、心理、法理、心理、教育、大数据、无障碍等多个领域。 他们专挑刁钻、陷…

苹果AI哪去了?前员工揭秘Siri何以走向没落:团队内耗、技术判断太谨慎

明敏 发自 凹非寺量子位 | 公众号 QbitAI 苹果为何会在最新一轮ChatGPT趋势中“静悄悄”&#xff1f; 答案更进一步浮出水面。 内部团队混乱、决策缓慢、代码笨重&#xff0c;都成为了拖累苹果AI更快前进的原因。 最直接的体现&#xff0c;可以来看Siri。 这大概是大部分普通人…

新规拉开中国生成式AI“百团大战”序幕?

AI将走向何方&#xff1f; ChatGPT在全球范围掀起的AI热潮正在引发越来越多的讨论&#xff0c;AI该如何管理&#xff1f;AI该如何发展&#xff1f;一系列问题都成为人们热议的焦点。此前&#xff0c;马斯克等海外名人就在网络上呼吁OpenAI暂停ChatGPT的模型训练和迭代&#xf…

苹果AI哪去了?前员工揭秘Siri何以走向没落:团队内耗、技术判断太谨慎!

省时查报告-专业、及时、全面的行研报告库 省时查方案-专业、及时、全面的营销策划方案库 【免费下载】2023年3月份热门报告合集 万字干货&#xff1a;ChatGPT的工作原理 2023年创业&#xff08;有创业想法&#xff09;必读手册 ChatGPT等让你效率倍增的22个AI工具 ChatGPT调研…

Mac下安装Redis 4.0(服务器端)

系统环境: CentOS 7.4 Redis版本: 4.0 这里采用终端下载解析安装: 1.1 进入/usr/local/目录 cd /usr/local/ 1.2 下载稳定版 wget http://download.redis.io/releases/redis-4.0.10.tar.gz 1.3 解压: tar -zxvf redis-4.0.10.tar.gz 1.4 进入解压后的文件中 cd redis-4.0.10 1.…

Mac下 Gradle4.0 详细安装攻略

macaca更新到2.0.0以上&#xff0c; 安卓需要使用gradle来构建app包&#xff0c;具体见Macaca 基于Python自动化测试框架搭建详解 ——Android、IOS搭建步骤&#xff0c;所以有了以下这篇文章。安装具体步骤如下&#xff1a; 
 • 下载最新的gradle的包&#xff0c;地址为&a…

mdserver(mac版) 4.0.1.0

mdserver(mac版) 4.0.1.0 Mac上高度可定制的PHP开发环境,集成必要的扩展,方便使用。 (pkg安装方式),安装方便,是你Mac上的PHP开发利器。 支持80端口。OpenResty(1.15.8.3)支持Lua开发。Redis(6.2.5),MongoDB(5.0.0),Memcached(1.6.10)。php-fpm以sock文件方式管理。多php进程…

Portraiture4.0最新免费磨皮美白滤镜修图插件

Portraiture这款老牌的一键磨皮修图插件终于更新啦&#xff01;最近官方推出了Portraiture 4.0.3版本&#xff01;新版本光影处理更强大&#xff0c;支持PS和LR软件&#xff01;&#xff01;最新版Portraiture 4.0.3插件滤镜下载安装包一PS人像精修磨皮美化修图神器&#xff0c…

pytorch gpu版本安装

正确的安装顺序 完蛋的&#xff0c;我写到现在才发现&#xff0c;由于我对于要安装的东西一知半解&#xff0c;导致我开始就被误导了&#xff0c;我首先查看了自己的cuda版本号&#xff0c;然后去安装pytorch&#xff0c;后来发现官网上pytorch都到11.6了&#xff0c;我才只有1…

【代码随想录day15】110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和

110.平衡二叉树 问题 题目链接&#xff1a;https://leetcode.cn/problems/balanced-binary-tree/ 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值…

SpringBoot自动装配串讲

目录 前言一. 基础概念1-1. Spring1-2. SpringBoot 二. 自动装配概览2-1. 效果&#xff08;目的&#xff09;2-2. 猜想2-3. SpringBoot的实现方案2-4. 对比及分析2-4-1. starter里为什么没有pom文件2-4-2. 配置类为什么没写在starter里 三. 自动装配细节3-1. 流程图3-2. 各部分…

告别抠图!海量免抠PNG,任你选

无论处理图片还是做PPT&#xff0c;经常会用到透明背景的图片素材&#xff0c;往往这种时候就需要进行抠图加 工。对PS图技术不佳的小伙伴而言&#xff0c;要抠出一张完美的图片并非易事。但也不是难事&#xff0c;只要你 有免抠PNG素材网&#xff08;搜图114 www.sotu114.co…

自己用ps抠图标

大家进入项目阶段已经有差不多一个月了&#xff1b;从简单数据库分析到慢慢的调试页面&#xff1b;再到 灵活的进行增删查改&#xff1b;相信在这一个月里大家的代码技术都有了一定的提高&#xff1b;相信对于以前学的现在是更加熟练了。对于不会的&#xff0c;可以通过网上查找…

不会PS怎么抠图换背景?赶紧收藏这3个好用的一键抠图神器

在现代社交媒体的世界里&#xff0c;给一张图片抠图换背景已经成为了互联网上很普遍的需求&#xff0c;比如有些朋友可能需要在社交媒体上分享自己的照片或制作一些创意性的设计作品&#xff0c;抠图换背景就可以帮助把图片创造出更好的视觉效果。一提到抠图去除背景&#xff0…