【算法学习】n个骰子的点数(Java)

2023-05-16

目录

    • 一、题目描述
    • 二、思路分析
        • 核心公式
        • 公式推导依据
    • 三、参考代码
    • 四、测试连接

一、题目描述

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

二、思路分析

  1. 题目要求:求解每种情况概率,概率 = 每种情况出现次数/总次数,总次数很简单即可重复排列 6n,问题需要先计算结果有多少种,以及每种出现的次数。
  2. 每个骰子可能有六种结果,即 1-6,那么一个筛子会出现如下结果:
    在这里插入图片描述
  3. 步骤2基础上加一个筛子,会出现以下情况:在这里插入图片描述
    步骤2步骤3结果放在一块对齐如下:
    在这里插入图片描述

发现规律如下:(博主也是辗转反侧得出正确结果,并非一次猜测就正确)

  • 骰子和会落在,n - 6 * n 这个区间(区间长度 len = 6*n-n+1 = 5n + 1,加 1 的原因是含起始数字)
  • 骰子数为 N,骰子和 F(n, t) 为,n - 1 个筛子,F(n-1, t - 1) + F(n-1, t - 2) + F(n-1, t-3) + F(n-1, t-4) + F(n-1, t-5) + F(n-1, t-6),注意这里有边界条件,如 F(2, 3) = F(1, 2) + F(1, 1),F(2, 7) = F(1, 1) + F(1, 2) + F(1, 3) + F(1, 4) + F(1, 5) + F(1, 6)。

核心公式

f ( n , t ) = f ( n − 1 , t − 1 ) + f ( n − 1 , t − 2 ) + f ( n − 1 , t − 3 ) + f ( n − 1 , t − 4 ) + f ( n − 1 , t − 5 ) + f ( n − 1 , t − 6 ) f(n, t) = f(n-1, t - 1) + f(n-1, t - 2) + f(n-1, t-3) + f(n-1, t-4) + f(n-1, t-5) + f(n-1, t-6) f(n,t)=f(n1,t1)+f(n1,t2)+f(n1,t3)+f(n1,t4)+f(n1,t5)+f(n1,t6)
注意:此处有坑,注意边界条件,后面公式最多六个。

公式推导依据

上面展示 步骤2步骤3结果图,可以观察到,每增加一个筛子,给现有情况都增加了六个可能性,并且这个可能性在 +1 到 +6 范围内,因此会有上文公式。
举个例子:n = 2,sum = 4 时,sum = 4 的组合可能来自于,n = 1 时的,(1 + 3,2 + 2,3+1),因此,sum = 4 的组合情况有 1 + 1 + 1 = 3 种可能。

计算出每种情况出现的次数后,概率就很简单了。

三、参考代码

class Solution {
    public double[] dicesProbability(int n) {
        int[] a = {1, 1, 1, 1, 1, 1};//最初形式
        int num = (int)Math.pow(6, n);// 共有这些可能
        int len = 5 * n + 1;
        int[][] r = new int[n][len];//二维数组,对应 i,j 指的是 i个筛子,和为 j 的个数
        double[] r2 = new double[len];
        for(int j = 0; j < 6; j++)
            r[0][j] = a[j];

        for(int i = 1; i < n; i++){// 从 n 等于 1 开始逐个推导至 n
            int t = 5 * i + 6;// (i+1) * 6 - (i+1-1)
            for(int j = 0; j < t; j++){
                int t2 = 0;
                for(int k = (j - 5) > 0 ? j - 5 : 0; k <= j; k++)
                    t2 += r[i - 1][k];//含当前数,往前五个
                r[i][j] = t2; 
            }
        }

        for(int j = 0; j < len; j++){//根据推导结果计算比例
            r2[j] = 1.0 * r[n-1][j] / num;
        }
        return r2;
    }
}

四、测试连接

力扣

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【算法学习】n个骰子的点数(Java) 的相关文章

  • Python enumerate() 函数

    enumerate 函数用于将一个可遍历的数据对象 如列表 元组或字符串 组合为一个索引序列 xff0c 同时列出数据和数据下标 xff0c 一般用在 for 循环当中 Python 2 3 以上版本可用 xff0c 2 6 添加 star
  • python3 opencv3 实现基本的人脸检测、识别功能

    encoding utf 8 老杨的猫 环境 PYCHARM xff0c python3 6 opencv3 import cv2 os import cv2 face as fc 此处有坑 找不到脸 这样引用程序可以运行 xff0c 欢迎
  • idea修改maven镜像

    https jingyan baidu com article c33e3f482455d2ea15cbb526 html https blog csdn net qq 32588349 article details 51461182 阿
  • Error:(1, 1) java: 非法字符: ‘\ufeff‘

    一 问题 用IDEA打开eclipse java项目编译时 xff0c 出现以下错误 xff1a Error 1 1 java 非法字符 ufeff Error 1 10 java 需要class interface或enum 二 原因分析
  • Zemax学习笔记(4)- 设计单透镜实例_1,设置

    Zemax学习笔记 xff08 4 xff09 设计单透镜 1 xff0c 设置 简介镜头分类参数和设计约束镜头数据编辑器定义系统设置定义视场设置波长插入表面输入镜头数据求解 设计单透镜分为3个部分 xff0c 设置 分析和优化 xff0c
  • libnet安装配置

    安装编译 1 下载安装包 http sourceforge net projects libnet dev 2 解压 tar zxvf libnet 1 2 rc3 tar gz 3 进去编译 configure make make ins
  • idea 创建Spring第一个项目

    1 知道什么是maven 网上一般说maven是一个构建工具 xff0c 其实是说得很准确的 xff0c 不过我觉得更准确的说法应该是一个自动化的构建工具 你可以这样说 xff1a 不用maven的时候所有的jar都不是你家的 xff0c
  • anconda 安装dlib

    pip install CMake pip install Boost 前面两个不知道有没有用 xff0c 我是直接安装了 pip install dlib 会直接报错 xff0c 所以要到网上下载whl文件来安装 xff0c 就可以了 用
  • nodejs学习五:sequelize数据库查询的Op方法

    span class token comment 查找users表数据name span span class token keyword const span op span class token operator span model
  • 使用diskpart修复EFI分区变主分区的问题

    diskgenius有时操作EFI分区会把EFI变成主分区 xff0c 太弱智了 xff0c 呵呵 xff0c 但是这个EFI分区本身有可能会变成主分区 xff0c 这样的话系统就无法识别了 xff0c Win8 1系统的diskpart可
  • 程序员会设计后是一种什么样的感觉

    我是一个iOS开发的程序员 xff0c 也是一个自由职业者 平时靠接一些外包和做自己的产品为生 做了这么多年 xff0c 给我的感觉是 xff1a 如果你只会写程序 xff0c 那么做自由职业者的空间要小很多 01 我为什么要学设计 做自己
  • win10笔记本使用virtualbox鼠标失灵

    win10笔记本使用virtualbox6时 xff0c 发现鼠标移动偏差极大 xff0c 完全无法操作虚拟机 解决方法 xff1a 虚拟机设置中将指点设备切换为USB触控板 xff0c 运行虚拟机后右下角鼠标处右键 xff0c 勾选鼠标集
  • SpringMVC的常用注解

    SpringMVC的常用注解 1 64 Controller 64 Controller 用于标记在一个类上 xff0c 使用它标记的类就是一个SpringMVC Controller 对象 2 64 RequestMapping 用于处理
  • Hive学习之修改表、分区、列

    修改表的语句允许改变现有表的结构 通过该语句可以增加列 分区 修改SerDe 增加表和SerDe的属性或者重命名表 与之类似 修改分区的语句可以改变指定分区的属性 重命名表 重命名表的语句如下 ALTER TABLE table name
  • sftp通过秘钥上传,修改文件

    sftp是通过openssh与服务端建立连接的 xff0c 默认端口为22 1 新建一个sftp的用户 xff0c 这里就叫sftp useradd span class hljs operator s span sbin nologin
  • 说说win32 控制台应用程序、win32 项目、mfc项目、空项目那些事儿

    首先 xff0c 说一下空项目 xff0c 大多数想单纯创建c 43 43 工程的新同学 xff0c 打开vs后很可能不知道选择创建什么工程 xff0c 这时候请相信我 xff0c 空项目是你最好的选择 因为空工程不包含任何的源代码文件 x
  • Docker常用命令,使用脚本在线或者离线安装Docker

    查看 停止 删除container 查看运行的容器 docker ps 查看所有容器 docker ps a 查看所有容器id docker ps aq 先停止运行container xff0c 再删除container xff0c 再删除
  • Spring配置数据源(XML)

    1 数据源 xff08 连接池 xff09 的作用 数据源 连接池 是提高程序性能如出现的 事先实例化数据源 xff0c 初始化部分连接资源 使用连接资源时从数据源中获取 使用完毕后将连接资源归还给数据源 常见的数据源 连接池 xff1a
  • Python开发GUI工具介绍,实战:将图片转化为素描画!

    阳光普照好刺眼 7月华为云社区与csdn联合举办了黑马程序员的征文活动 xff0c 由于规则简单 xff08 保证原创文章 内容为技术类为主 且文章篇幅1000字 43 即可 xff09 xff0c 所以兴高采烈的参加了活动 本来是抱着打酱
  • spring boot配置加载不出来?

    新建一个项目发现不能用 xff0c maven依赖加载不出来 xff0c 问题界面如下 xff1a 可以明确是maven依赖出了问题 xff0c 检查配置 1 xff09 检查本地仓库是否配置正确 xff1a span class toke

随机推荐

  • iOS NSAttributedString(属性字符串)

    NSAttributedString实际上就是一个字符串和一本字典 字典包含每一个字符的属性 xff1a 包括字体 大小 下划线 颜色等等 关键是要知道字典中每个key的含义以及相应value的取值范围 Character Attribut
  • 无人机姿态解算_互补滤波(1)

    一 基础知识 1 坐标系 xff1a 遵循右手定则 1 1 大地坐标系 xff08 地球坐标系 xff09 xff1a 北 xff08 x轴 xff09 东 xff08 y轴 xff09 地 xff08 z轴 xff09 xff0c 地就是
  • 学会 Go 中的时间处理

    作为程序员 xff0c 我们经常需要对时间进行处理 在 Go 中 xff0c 标准库 time 提供了对应的能力 本文将介绍 time 库中一些重要的函数和方法 xff0c 希望能帮助到那些一遇到 Go 时间处理问题就需要百度的童鞋 应对时
  • Ubuntu修改文件权限

    Linux内的一切皆文件 xff0c 所以对于Linux下文件的管理就十分的重要了 Linux下的文件权限分为三种 xff1a r xff08 读 xff09 xff0c w xff08 写 xff09 xff0c x xff08 执行 x
  • Libnet简单学习

    简单了解后 xff0c 建议直接查看源码 xff0c 以获得其他函数 xff1a libnet libnet functions h File Reference 本文仅列举个别常用函数 libnet工作流程 xff08 1 xff09 通
  • Java模拟生产者消费者模型【仅代码 + 注释】

    模拟仓库容量为1 xff0c 1个消费者 xff0c 1个生产者的生产者消费者模型 span class token keyword package span span class token namespace com span clas
  • PHP8.2 Apache24 Windows10安装步骤

    PHP8 2 Apache24 Windows10安装步骤 1 官网地址 https httpd apache org download cgi 修改1 xff1a Define SRVROOT D WorkSoft Apache Apac
  • navicat乱码和激活

    乱码 xff1a 1 将export LANG 61 34 zh CN UTF 8 34 2 工具 gt 选项下常规 编辑器 xff0c 记录下的字体选Noto sans CJK相近字体 激活 xff1a 第一次执行start navica
  • OnclickListener

    相信很多像我一样的新手学习ANDROID开发会遇到这个问题 xff0c 通过这几天的归类和总结 xff0c 将我的理解写在下面 xff0c 欢迎大家一起前来讨论 xff1a 以按钮BUTTON的监听事件为例 xff0c 以下的监听实现都是等
  • 关于Activity的onNewIntent方法

    前言 onNewIntent方法想必大家都知道 xff0c 是和Activity的启动模式结合起来使用的 xff0c 可以这个方法具体什么情况下被调用 xff0c 如何使用你清楚了吗 xff1f 今天就来一探究竟 xff0c 扫清疑惑 实验
  • 【算法学习】二分查找 binary-search (Java 参考)

    题目描述 给定一个 n 个元素有序的 xff08 升序 xff09 整型数组 nums 和一个目标值 target xff0c 写一个函数搜索 nums 中的 target xff0c 如果目标值存在返回下标 xff0c 否则返回 1 思路
  • 【算法学习】二维数组检索 search-a-2d-matrix(Java)

    题目描述 请写出一个高效的在m n矩阵中判断目标值是否存在的算法 xff0c 矩阵具有如下特征 xff1a 每一行的数字都从左到右排序 每一行的第一个数字都比上一行最后一个数字大 例如 xff1a 对于下面的矩阵 xff1a 1 3 5 7
  • 【算法学习】二维数组查找(Java)

    一 题目描述 此题源于 剑指 offer 在一个二维数组中 xff08 每个一维数组的长度相同 xff09 xff0c 每一行都按照从左到右递增的顺序排序 xff0c 每一列都按照从上到下递增的顺序排序 请完成一个函数 xff0c 输入这样
  • 【算法学习】链表数相加(Java)

    一 题目表述 给定两个代表非负数的链表 xff0c 数字在链表中是反向存储的 xff08 链表头结点处的数字是个位数 xff0c 第二个结点上的数字是十位数 xff09 xff0c 求这个两个数的和 xff0c 结果也用链表表示 输入 xf
  • 【算法学习】最长公共子序列(Java)

    一 题目描述 给定两个字符串 text1 和 text2 xff0c 返回这两个字符串的最长公共子序列的长度 一个字符串的 子序列 是指这样一个新的字符串 xff1a 它是由原字符串在不改变字符的相对顺序的情况下删除某些字符 xff08 也
  • JFugue4.0 中文说明

    简介 由音符 八度 音长 音色 xff08 乐器 xff0c 默认乐器为钢琴 xff09 组成 和弦 连音 速冻 控制器 键签名 Jfugue 可以简单并且允许工程师去快速创建音乐的原因是 MusicString xff0c 一个特殊格式描
  • 【算法学习】有效括号 valid-parentheses (Java 参考)

    题目描述 给定一个只包括 xff0c xff0c xff0c xff0c xff0c 的字符串 xff0c 判断字符串是否有效 有效字符串需满足 xff1a 左括号必须用相同类型的右括号闭合 左括号必须以正确的顺序闭合 注意空字符串可被认为
  • 【算法学习】约瑟夫环(含公式思想总结)(Java)

    目录 一 题目描述二 思路分析思路1 xff1a 模拟思路2 xff1a 数学方法递推公式 xff1a 推导思路why 为什么可以倒推how 如何倒推 三 参考代码四 测试连接 一 题目描述 这个问题是以弗拉维奥 约瑟夫命名的 xff0c
  • Ubuntu下matplotlib中文乱码

    原因 xff1a 由于matplotlib的默认安装字体不支持中文格式 解决思路 xff1a 将默认字体换成可以支持中文字体包 matplotlib默认的字体文件为 anaconda3 lib python3 7 site packages
  • 【算法学习】n个骰子的点数(Java)

    目录 一 题目描述二 思路分析核心公式公式推导依据 三 参考代码四 测试连接 一 题目描述 把n个骰子扔在地上 xff0c 所有骰子朝上一面的点数之和为s 输入n xff0c 打印出s的所有可能的值出现的概率 你需要用一个浮点数数组返回答案