1. 题目

把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 <= n <= 11

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/nge-tou-zi-de-dian-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

类似题目:
LeetCode 1155. 掷骰子的N种方法(DP)
LeetCode 1223. 掷骰子模拟(DP)

  • 建立二维数组dp,dp[i][j] 表示第i次投下后,得分为j的次数
  • 那么状态转移方程是 dp[i][j]=∑dp[i−1][j−k],1≤k≤6dp[i][j] = \sum dp[i-1][j-k], 1\le k \le6dp[i][j]=∑dp[i−1][j−k],1≤k≤6
class Solution {public:vector<double> twoSum(int n) {vector<vector<int>> dp(n, vector<int>(6*n+1, 0));int i, j, k, count = pow(6,n);for(j = 1; j <= 6; ++j)dp[0][j] = 1;for(i = 1; i < n; ++i){for(j = 6*i; j >= i; --j){for(k = 6; k >= 1; --k)dp[i][j+k] += dp[i-1][j];}}vector<double> ans(5*n+1);k = 0;for(j = n; j <= 6*n; ++j)ans[k++] = double(dp[n-1][j])/count;return ans;}
};

  • 从上面可看出,状态转移方程仅与上一行有关,可以进行状态压缩
class Solution {public:vector<double> twoSum(int n) {vector<int> dp(6*n+1, 0);vector<int> temp(6*n+1, 0);int i, j, k, count = pow(6,n);for(j = 1; j <= 6; ++j)dp[j] = 1;for(i = 1; i < n; ++i){for(j = 6*i; j >= i; --j){for(k = 6; k >= 1; --k)temp[j+k] += dp[j];}swap(temp,dp);//更新dp数组for(j = 6*i; j >= i; --j)temp[j] = 0;//temp清零}vector<double> ans(5*n+1);k = 0;for(j = n; j <= 6*n; ++j)ans[k++] = double(dp[j])/count;return ans;}
};

剑指Offer - 面试题60. n个骰子的点数(动态规划)相关推荐

  1. 剑指offer——面试题60:把二叉树打印成多行

    剑指offer--面试题60:把二叉树打印成多行 Solution1: 20180911重做.经典题目.牢记做法! /* struct TreeNode {int val;struct TreeNod ...

  2. 剑指offer面试题[60]-将二叉树打印成多行

    题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. /* struct TreeNode {int val;struct TreeNode *left;struct TreeN ...

  3. 剑指Offer - 面试题47. 礼物的最大价值(动态规划)

    1. 题目 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0).你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格.直到到达棋盘的右下角.给定一个棋盘 ...

  4. [剑指offer]面试题第[57]题[Leetcode][第167题][JAVA][和为s的两个数字][两数之和][HashSet][二分][双指针]

    [剑指offer]面试题第[57]题[Leetcode][第167题][第1题] 有序无序之分 题目输出不同之分 以下解法按照[剑指offer]面试题第[57]题进行题解 [问题描述][简单] 输入一 ...

  5. 剑指offer——面试题32:从1到n整数中1出现的次数

    剑指offer--面试题32:从1到n整数中1出现的次数 Solution1: 最容易想到的方法: class Solution { public:int NumberOf1Between1AndN_ ...

  6. 【剑指Offer面试题】 九度OJ1510:替换空格

    c/c++ 中的字符串以"\0"作为结尾符.这样每一个字符串都有一个额外字符的开销. 以下代码将造成内存越界. char str[10]; strcpy(str, "01 ...

  7. 剑指offer 面试题三 找出数组中重复的数字

    1 import org.junit.Test; 2 3 import java.util.Arrays; 4 import java.util.HashSet; 5 6 public class D ...

  8. [剑指offer]面试题第[68-2]题[Leetcode][第236题][JAVA][二叉搜索树的最近公共祖先][递归]

    [问题描述][中等] 235/68-1 搜索二叉树 236/68-2 二叉树 [解答思路] 递归 时间复杂度:O(N) 空间复杂度:O(N) 情况 1. , 2. , 3. , 4. 的展开写法如下. ...

  9. 两个数组中对应的下标的值合成一个新的数组_剑指 offer 面试题精选图解 03 . 数组中重复的数字

    今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 面试题03. 数组中重复的数字. 题目链接:https://leetcode-cn.com/problems/shu-zu-zhon ...

最新文章

  1. python爬虫教程入门-零基础入门Python爬虫不知道怎么学?这是入门的完整教程
  2. Spring MVC中handlerMapping的设计
  3. IOS 多线程的一些总结
  4. 不做旁观者,给博主最有力的支持——博客之星评选,期待您的支持,谢谢路过的朋友投上您宝贵的一票...
  5. mysql —— 分表分区
  6. centos6.5 nginx1.8 php mysql,CentOS6.5 源码安装Nginx1.8 + PHP7.0.6 + MySQL5.7.12
  7. 蒙特卡洛粒子滤波定位算法_基于粒子滤波的TBD算法仿真—MATLAB仿真
  8. 华为电脑管家PcManager多屏协同功能破解
  9. ble原理(1)蓝牙ble协议知识
  10. 211. 字符串置换
  11. IDL读写FITS文件
  12. ImageWatch无法显示图像
  13. 二维码解码器Zbar+VS2010开发环境配置
  14. citus插件安装及使用
  15. 17年渣本毕业的我,21年终于进了大厂(薪资和福利真的拉满)
  16. 【css】为什么#fff和#ffffff是一样的?或者说#fff和#ffffff的区别
  17. 俄罗斯开发者赢得Facebook Hacker Cup大赛 楼天成获季军
  18. 小米校招编程题:数组乘积、异形数、朋友圈
  19. 求1900到2017的闰年天数
  20. Cocos Creator AssetBundle 游戏分包方案评估

热门文章

  1. GetProcAddress()用法
  2. C++的迭代器Interator
  3. 设置View单个圆角
  4. Linux设备驱动模型1——简介和底层架构
  5. s5pv210——AD转换
  6. java异常个人理解
  7. 位图索引,数据库索引浅浅的学习
  8. 现在中国是以24枚金牌位列奖牌榜3位,美国英国分列1、2位
  9. 微信开发学习日记(一):快速阅读5本书,掌握整体背景
  10. windbg 常用命令详解