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

Offer_60

题目详情

题解分析

  1. package com.walegarrett.offer;
  2. /**
  3. * @Author WaleGarrett
  4. * @Date 2021/2/12 18:29
  5. */
  6. /**
  7. * 题目描述:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。
  8. * 你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。
  9. */
  10. import java.util.Arrays;
  11. /**
  12. * 动态规划:dp[i][j]表示掷n个骰子后,点数总和为j出现的次数
  13. */
  14. public class Offer_60 {
  15. public double[] dicesProbability(int n) {
  16. int[][] dp = new int[n+1][70];
  17. for(int i=1; i<=6; i++){
  18. dp[1][i] = 1;
  19. }
  20. for(int i=2; i<=n; i++){
  21. for(int j=i; j<=6*i; j++){
  22. for(int k=1; k<=6 && j-k>0; k++)
  23. dp[i][j] += dp[i-1][j-k];
  24. }
  25. }
  26. double allP = Math.pow(6,n);
  27. double[] result = new double[6*n-n+1];
  28. for(int i=n; i<=6*n; i++){
  29. result[i-n] = dp[n][i] * 1.0 / allP;
  30. }
  31. return result;
  32. }
  33. }

空间优化

  1. /**
  2. * 动态规划:空间优化
  3. */
  4. class Offer_60_1 {
  5. public double[] dicesProbability(int n) {
  6. int[] dp = new int[70];
  7. Arrays.fill(dp,0);
  8. for(int i=1; i<=6; i++){
  9. dp[i] = 1;
  10. }
  11. for(int i=2; i<=n; i++){
  12. for(int j=6*i; j>=i; j--){
  13. dp[j] = 0;//很重要
  14. for(int k=1; k<=6 && j-k>=i-1; k++)
  15. dp[j] += dp[j-k];
  16. }
  17. }
  18. double allP = Math.pow(6,n);
  19. double[] result = new double[6*n-n+1];
  20. for(int i=n; i<=6*n; i++){
  21. result[i-n] = dp[i] * 1.0 / allP;
  22. }
  23. return result;
  24. }
  25. }

题解参考:【n个骰子的点数】:详解动态规划及其优化方式

剑指 Offer 60. n个骰子的点数 + 动态规划 + 空间优化的更多相关文章

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

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

  2. 【Java】 剑指offer(60) n个骰子的点数

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s.输入n,打 ...

  3. 【剑指offer】n个骰子的点数,C++实现

    # 题目 # 思路 # 代码

  4. 剑指offer-面试题60-n个骰子的点数-动态规划

    /* 题目: 计算n个骰子,出现和s的概率. */ #include<iostream> #include<cstdlib> #include<stack> #in ...

  5. 剑指 Offer 46. 把数字翻译成字符串 + 动态规划

    剑指 Offer 46. 把数字翻译成字符串 Offer_46 题目描述 题解分析 本题的解题思路是使用动态规划,首先得出递推公式如下 dp[i] = dp[i-1]+dp[i-2](如果s[i-1] ...

  6. 剑指Offer 60. 把二叉树打印成多行 (二叉树)

    题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 题目地址 https://www.nowcoder.com/practice/445c44d982d04483b04a54f ...

  7. [剑指Offer] 60.把二叉树打印成多行

    题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. [思路]使用队列实现二叉树的层次遍历. /* struct TreeNode { int val; struct TreeN ...

  8. 剑指offer——60二叉树的深度

    题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.   题解: 简单的深度遍历即可.   class Solution ...

  9. LeetCode:“剑指 Offer”

    LeetCode:"剑指 Offer" 刷题小菜鸡,花了几天时间做了一遍 LeetCode 上给出的 "剑指 Offer" 在此做一下记录 LeetCode主页 ...

随机推荐

  1. 2020牛客暑期多校训练营(第四场)BCFH

    BCFH B. Basic God Problem 题意 给出c和n,求fc(n). 题解 递归到最后 fc 函数肯定等于1,那么就变成了求c被乘了几次,只要找到 x 最多能被分解成多少个数相乘就好了 ...

  2. Codeforces 1355 D. Game With Array

    传送门:D - Game With Array 题意:让你构造一个长度为n的序列,并且n个数的和为S,问能不能找到一个1~n的数k,使得数组里找不出一个子序列的和为k或者n-k: 题解:最简单的想法肯 ...

  3. 【bzoj 3232】圈地游戏(算法效率--01分数规划+图论--最小割)

    题目:DZY家的后院有一块地,由N行M列的方格组成,格子内种的菜有一定的价值,并且每一条单位长度的格线有一定的费用.DZY喜欢在地里散步.他总是从任意一个格点出发,沿着格线行走直到回到出发点,且在行走 ...

  4. java中static修改成员变量和函数和其他使用

    一.通过static修饰的成员变量初始化只会初始化一次 //静态变量初始化只会初始化一次 public class zuishuai { public static void main(String[ ...

  5. 2020ICPC&#183;小米 网络选拔赛第一场 J.Matrix Subtraction (贪心,二维差分)

    题意:给一个\(nXm\)的矩阵,可以选取\(aXb\)的子矩阵,使子矩阵中的所有元素减一,问最后是否能使矩阵中所有元素变为\(0\). 题解:首先贪心,我们看最左上角的元素,如果\(g[1][1]\ ...

  6. B-number HDU - 3652

    题意: 找出区间[li,ri]有多少个符合要求的数: 1.这个数里面有13 2.这个数可以被13整除 题解: 这个题目和之前的有点不一样就是这个题目要我们求包含13的(之前做过的都是不包含).但是都差 ...

  7. 获取csc.exe路径

    using System.Runtime.InteropServices; var frameworkPath = RuntimeEnvironment.GetRuntimeDirectory(); ...

  8. codeforces 3D (非原创)

    D. Least Cost Bracket Sequence time limit per test 1 second memory limit per test 64 megabytes input ...

  9. Gym 101480F Frightful Formula(待定系数)题解

    #include<cmath> #include<set> #include<map> #include<queue> #include<cstd ...

  10. H5 页面如何展示大量的表格数据

    H5 页面如何展示大量的表格数据 列数过多 图表化 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!