20-骰子求和

扔 n 个骰子,向上面的数字之和为 S。给定 Given n,请列出所有可能的 S 值及其相应的概率。

注意事项

You do not care about the accuracy of the result, we will help you to output results.

样例

给定 n = 1,返回 [ [1, 0.17], [2, 0.17], [3, 0.17], [4, 0.17], [5, 0.17], [6, 0.17]]。

标签

数学 动态规划 概率

思路

利用动态规划,用二维数组 dp[i][j] 表示 i 颗骰子所能掷出点数为 j 的次数。

  • 初始时只有一颗骰子,此时 dp[1][j] = 0,(1 <= j <= 6)
  • 加一颗骰子后,此时 2 颗骰子所能掷出的点数为 2 到 12,此时投掷的结果与上一次投掷的结果相关,若 2 颗骰子投出 j 点,则要求第 1 颗投掷投出 k 点且第 2 颗投出 j - k 点(j > k) ,例如 dp[2][2] = dp[1][1],dp[2][3] = dp[1][1] + dp[1][2]...
  • 一般化,加至第 i 颗骰子后,此时 i 颗骰子所能掷出的点数为 i 到 6 * 1,此时投掷的结果与前 i - 1次投掷的结果相关,若 i 颗骰子投出 j 点,则要求前 i - 1 颗投掷投出 k 点且第 2 颗投出 j - k点(j > k) ,即 dp[i][j] = dp[i-1][j-1] + dp[i-1][j-2] + dp[i-1][j-3] + dp[i-1][j-4] + dp[i-1][j-5] + dp[i-1][j-6]

最后某点的次数除以总数,即投掷出此点的概率。

code

class Solution {
public:/*** @param n an integer* @return a list of pair<sum, probability>*/vector<pair<int, double>> dicesSum(int n) {// Write your code hereif (n <= 0) {return vector<pair<int, double> >();}long long total = powOf6(n);vector<vector<long long>> dp(n + 1, vector<long long>(6 * n + 1, 0));dp[1][1] = 1;dp[1][2] = 1;dp[1][3] = 1;dp[1][4] = 1;dp[1][5] = 1;dp[1][6] = 1;for (int i = 2; i <= n; i++) {for (int j = i; j <= i * 6; j++) {long x1 = 0, x2 = 0, x3 = 0, x4 = 0, x5 = 0, x6 = 0;if (j - 1 > 0) {x1 = dp[i - 1][j - 1];}if (j - 2 > 0) {x2 = dp[i - 1][j - 2];}if (j - 3 > 0) {x3 = dp[i - 1][j - 3];}if (j - 4 > 0) {x4 = dp[i - 1][j - 4];}if (j - 5 > 0) {x5 = dp[i - 1][j - 5];}if (j - 6 > 0) {x6 = dp[i - 1][j - 6];}dp[i][j] = x1 + x2 + x3 + x4 + x5 + x6;}}vector<pair<int, double> > result;for (int i = n; i <= 6 * n; i++) {pair<int, double> p(i, double(dp[n][i]) / total);result.push_back(p);}return result;}long long powOf6(int n) {long long sum = 1;for (int i = 0; i<n; i++) {sum *= 6;}return sum;}
};

转载于:https://www.cnblogs.com/libaoquan/p/7360331.html

lintcode-20-骰子求和相关推荐

  1. lintcode 骰子求和

    /* 今天被问到了一道lintcode上的题目,然而想了好久才想明白,看来在STL处折腾得太久,当初看<挑战>时,粗浅地学的一点点动态规划,已经忘得所剩无几了...这几天开始上课了,写ac ...

  2. Lintcode 167. 链表求和 221. 链表求和 II 题解

    167. 链表求和 描述 你有两个用链表代表的整数,其中每个节点包含一个数字.数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头.写出一个函数将两个整数相加,用链表形式返回和. 样例 给 ...

  3. LintCode 1689. k求和III(递归)

    1. 题目 给出 n 个正整数和整数 k 以及一个目标数字 target. 在 n 个数中找出 k 个奇数 或 k 个偶数 使得和为target,输出方案数 样例 1: 给出 `[1,2,3,4], ...

  4. LintCode 207. 区间求和 II(线段树)

    1. 题目 在类的构造函数中给一个整数数组, 实现两个方法 query(start, end) 和 modify(index, value): 对于 query(start, end), 返回数组中下 ...

  5. LintCode解题目录

    看见 LintCode 的代码能力测试CAT(Coding Ability Test)挺好,有倒计时,挺有面试紧迫感.做个记录. 另有本人 LeetCode解题目录.<程序员面试金典>解题 ...

  6. excel排序求和:如何统计前几名数据合计 上篇

    什么叫做统计前几名合计呢?先看看动画演示吧: 可以看到,数据按照销售数量从高往低排列,选择一个名次,就可以对前几名的销售数量求和. 这类问题在很多与数字排名有关的情况下都用得上,例如对前几名考试成绩求 ...

  7. lintcode_167. 链表求和

    lintcode 167. 链表求和 描述:你有两个用链表代表的整数,其中每个节点包含一个数字.数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头.写出一个函数将两个整数相加,用链表形式 ...

  8. 系统软件工程师面试题

    一.c++语言部分 1. extern c 将让 C++ 中的函数名具备 C-linkage 性质,目的是让 C 代码在调用这个函数时,能正确的链接到具体的地址. C调用C++,使用extern &q ...

  9. eclipse折叠if语句块_「03」java中的方法以及控制语句

    语句块(有时叫做复合语句),是用花括号扩起的任意数量的简单Java语句.块确定了局部变量的作用域.块中的程序代码,作为一个整体,是要被一起执行的.块可以被嵌套在另一个块中,但是不能在两个嵌套的块内声明 ...

  10. Java基础1语法准备

    77集程序底层执行 初识Java 1.1计算机语言发展史以及未来 计算机语言经历了三代:第一代是机器语言,第二代是汇编语言,第三代是高级语言. ·第一代语言:机器语言(相当于人类的原始阶段) 机器语言 ...

最新文章

  1. python机器学习可视化工具Yellowbrick介绍及平行坐标图实战示例
  2. 垃圾代码评析——关于《C程序设计伴侣》9.4——链表(四)
  3. ORACLE安装请注意事项
  4. 检测输入路径是否存在错误_为什么存在用户输入错误
  5. python网易云_用python爬虫爬取网易云音乐
  6. sklearn随机森林概述
  7. php异步请求$.post,如何用PHP实现异步请求、忽略返回值
  8. linux系统编程之进程(七):system()函数使用【转】
  9. 【英语学习】【加州教材】【G5】【科学】Science目录及术语表
  10. Redis 2.8.9源码 - Redis中的字符串实现 sds
  11. 构建大型 Mobx 应用的几个建议
  12. Activities
  13. Linux samba服务
  14. ArcGIS导出地图后部分图例不显示
  15. 大一新生HTML期末作业 学生个人网页设计作业 HTML5响应式个人简历网站模板 web前端网页制作课作业
  16. 腾讯校招智力题-赛马问题-毒药与老鼠
  17. java.lang.UnsatisfiedLinkError解决方法汇集(转载)
  18. “The Gentle Lentil Restaurant“ Case Solution Report 模型与决策-温柔小扁豆餐厅例题
  19. python基础(二十三):面向对象编程精髓演练(选课系统)、封装
  20. 文本挖掘 包含中英文数据预处理以及分析

热门文章

  1. 吓skr人!BATJ六大男神来了,还说......
  2. 浅析那些带着“主角光环“的泰坦尼克号幸存者(下)
  3. BZOJ 1106: [POI2007]立方体大作战tet 树状数组 + 贪心
  4. PHP移动互联网开发笔记(6)——MySQL数据库基础回想
  5. 移动、复制、新增工作表
  6. Windows下SVN已检出项目自动更新
  7. ORACLE 常用函数——字符函数
  8. 金融账务体系业务知识——汇总
  9. 对variable-sized object may not be initialized的一点理解
  10. 多线程 NSThread 的使用