当前位置: 首页 > news >正文

剑指Offer 60.n个骰子的点数

一、思路:题目要求是计算掷n个骰子时,所有可能点数出现的概率。这道题可以用动态规划dp来做。

1.投掷n个骰子时,可能出现的总和最小值是n * 1,可能出现的总和最大值是n * 6

2.从最小值到最大值中,所有连续的整数都是可以取到的,这是因为可以通过每次增加1点的点数的方式来调整骰子点数,从而得到中间的所有整数。因此所有的总和值构成了一个连续的整数区间

3.因此所有可能出现的点数的总数量 = 6n - n + 1 = 5n + 1

二、动态规划dp

1.确定dp数组及其下标的含义:dp[i][j]表示投掷i个骰子,点数总和恰好等于j的概率

2.确定递推公式:

可知i个骰子的情况可以由i - 1个骰子的情况推出

(1)因此dp[i][j] = dp[i - 1][j - 6] + dp[i - 1][[j - 5] + dp[i - 1][j - 4] + dp[i - 1][j - 3] + dp[i - 1][j - 2] + dp[i - 1][j - 1]

(2)即:dp[i][j] = dp[i - 1][j - k] for k = 1 to 6

3.dp数组如何初始化:dp[1][j]=1/6​ for j = 1 to 6。表示使用1个骰子的时候,点数总和恰好等于1,2,3,4,5,6的概率均为1/6

4.确定遍历顺序:从前往后遍历即可。在二维dp中遍历顺序其实不太敏感。因为我们在用二维数组存储所有状态,每个状态只依赖上一行的数据。

附代码:

class Solution { public double[] dicesProbability(int n) { // dp[i][j] 表示投掷 i 个骰子,点数和为 s 的概率 // i 的范围:0 ~ n // j 的范围:0 ~ 6*n(但实际有效范围是 i ~ 6*i) double[][] dp = new double[n + 1][6 * n + 1]; // 初始化:1个骰子的情况 for (int j = 1; j <= 6; j++) { dp[1][j] = 1.0 / 6.0; } // 从第2个骰子开始递推 for (int i = 2; i <= n; i++) { // 当前i个骰子的点数和范围:i ~ 6*i for (int j = i; j <= 6 * i; j++) { // 第i个骰子掷出k(1~6),则前i-1个骰子的和为 j-k for (int k = 1; k <= 6; k++) { int prevSum = j - k; // 检查前i-1个骰子的和是否有效,即是否大于i - 1(对应点数和全为1的情况) if (prevSum >= i - 1){ // 前i - 1个骰子点数总和等于j - k的概率 * 第i个骰子点数为1/6的概率 // 因为k会从1-6中取值,所以要把这6种可能累加 dp[i][j] += dp[i - 1][prevSum] * (1.0 / 6.0); } } } } // 提取结果:n个骰子的有效范围是 n ~ 6n int total = 5 * n + 1; double[] result = new double[total]; for (int i = 0; i < total; i++) { // 索引转换,n的骰子时的点数总和范围为n到6n,对应j // 对应的dp数组的位置即为dp[n][n]到dp[n][6n] result[i] = dp[n][n + i]; } return result; } }

ACM模式:

import java.util.Scanner; class Solution { public double[] dicesProbability(int n) { // dp[i][j] 表示投掷 i 个骰子,点数和为 s 的概率 // i 的范围:0 ~ n // j 的范围:0 ~ 6*n(但实际有效范围是 i ~ 6*i) double[][] dp = new double[n + 1][6 * n + 1]; // 初始化:1个骰子的情况 for (int j = 1; j <= 6; j++) { dp[1][j] = 1.0 / 6.0; } // 从第2个骰子开始递推 for (int i = 2; i <= n; i++) { // 当前i个骰子的点数和范围:i ~ 6*i for (int j = i; j <= 6 * i; j++) { // 第i个骰子掷出k(1~6),则前i-1个骰子的和为 j-k for (int k = 1; k <= 6; k++) { int prevSum = j - k; // 检查前i-1个骰子的和是否有效,即是否大于i - 1(对应点数和全为1的情况) if (prevSum >= i - 1){ // 前i - 1个骰子点数总和等于j - k的概率 * 第i个骰子点数为1/6的概率 // 因为k会从1-6中取值,所以要把这6种可能累加 dp[i][j] += dp[i - 1][prevSum] * (1.0 / 6.0); } } } } // 提取结果:n个骰子的有效范围是 n ~ 6n int total = 5 * n + 1; double[] result = new double[total]; for (int i = 0; i < total; i++) { // 索引转换,n的骰子时的点数总和范围为n到6n,对应j // 对应的dp数组的位置即为dp[n][n]到dp[n][6n] result[i] = dp[n][n + i]; } return result; } } public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); scanner.close(); Solution solution = new Solution(); double[] result = solution.dicesProbability(n); for (int i = 0; i < result.length; i++) { System.out.printf("%.5f", result[i]); if (i < result.length - 1) { System.out.print(" "); } } System.out.println(); } }
http://www.jsqmd.com/news/748151/

相关文章:

  • 如何3步完成智能图像分层:layerdivider的终极使用指南
  • nSkinz完整指南:如何在CS:GO中免费自定义武器皮肤
  • OpenClaw长任务恢复:轻量级持久化执行与断点续做实践
  • 别再傻傻重启电脑了!用Windows自带的taskkill命令,1分钟精准干掉占用8080端口的进程
  • 3分钟掌握电话号码定位技术:开源工具实战指南
  • Hide Mock Location完整指南:轻松绕过Android位置检测的终极方案
  • SkyBridge:构建AI模型统一接入层,实现多模型智能路由与生产级运维
  • CacheMind:用自然语言优化缓存替换策略的AI工具
  • ADC架构解析:从基础原理到选型指南
  • Pydantic AI框架深度解析2026:类型安全的AI应用开发新范式
  • 2026年AI技术深度复盘:从内容生成到自主作业,人工智能进入工程落地时代
  • 从灾害预警到智慧农业:拆解GeoAI落地的5个真实商业案例与技术选型
  • 避坑指南:GDAL源码编译那些‘坑’——从proj报错到geos未启用,我的填坑记录
  • 实战应用:基于pencil设计理念,用快马ai快速搭建‘智绘’设计工具官网
  • Arm CoreLink MMU-700内存管理单元架构与优化实践
  • MTKClient:拯救变砖手机的终极开源刷机工具指南
  • PIM架构下同态加密加速:DRAMatic方案解析
  • 【Python风控决策优化实战指南】:7大高频陷阱与5步精准调优法(2024银行级验证版)
  • KOL运营工程化:从数据采集到自动化归因的技术实现
  • 2026成都奢侈品回收典当品牌推荐榜:附近奢侈品回收/九眼桥二手手表回收/二手奢侈品回收/劳力士名表回收/同城奢侈品回收/选择指南 - 优质品牌商家
  • 基于Playwright的自动化申领工具:从原理到实战部署
  • BetterGI自动战斗功能生存位切换异常深度解析
  • 【PostgreSQL从零到精通】第15篇:约束与数据完整性——让数据库帮你守住数据质量的底线
  • 别再死记硬背了!用ASN.1编码拆解一个真实的5G NGAP Setup消息
  • UE5新手别慌!从Canvas画布到按钮交互,手把手带你搞定第一个HUD界面
  • 在微服务架构中利用Taotoken统一管理多个AI模型调用
  • n个六面的骰子,扔一次之后和为k的概率是多少?
  • 避坑指南:Pixhawk 4 Mini飞控与Jetson NX串口通信,从参数配置到mavros启动的完整排错流程
  • 2026四川租客车技术指南:成都租客车、成都租旅游大巴车、成都租旅游车、四川大巴包车、四川大巴租赁、四川客车租赁选择指南 - 优质品牌商家
  • SSH连接管理工具开发:从原生配置到动态化、安全化实践