43. 动态规划求解n个骰子的点数和出现概率(或次数)[Print sum S probability of N dices]
【题目】
把N个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入N,打印出S的所有可能的值出现的概率。
【分析】
典型的动态规划题目。
设n个骰子的和为s出现的次数记为f(n,s),其中n=[1-N],s=[n-6n]。
n=1, s=[1-6], f(n,s)=1;
n=[2-N], s=[n-6n], f(n,s)= f(n-1,s-1)+ f(n-1,s-2)+ f(n-1,s-3)+ f(n-1,s-4)+ f(n-1,s-5)+ f(n-1,s-6) = sum(f(n-1,s-t)) ,其中t=[1-6] and t<s。
最终点数之和为S出现的次数为f(N,S),概率为f(N,S)/6N。
【代码】
|
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
// 43_PrintSumProbabilityOfDices.cpp : Defines the entry point for the console application.
// #include "stdafx.h" /* int f[MAXN][MAXS]; void PrintSumProbabilityOfDices(int N) int n, s, t; // n>=2 // print the probability or counts void test_base(int n) void test_main() int _tmain(int argc, _TCHAR *argv[]) |
【运行结果】
win7+vs2010运行结果:
只贴出了n=1到8的结果。
1 dices.
1--->1
2--->1
3--->1
4--->1
5--->1
6--->1
----------------------
2 dices.
2--->1
3--->2
4--->3
5--->4
6--->5
7--->6
8--->5
9--->4
10--->3
11--->2
12--->1
----------------------
3 dices.
3--->1
4--->3
5--->6
6--->10
7--->15
8--->21
9--->25
10--->27
11--->27
12--->25
13--->21
14--->15
15--->10
16--->6
17--->3
18--->1
----------------------
4 dices.
4--->1
5--->4
6--->10
7--->20
8--->35
9--->56
10--->80
11--->104
12--->125
13--->140
14--->146
15--->140
16--->125
17--->104
18--->80
19--->56
20--->35
21--->20
22--->10
23--->4
24--->1
----------------------
5 dices.
5--->1
6--->5
7--->15
8--->35
9--->70
10--->126
11--->205
12--->305
13--->420
14--->540
15--->651
16--->735
17--->780
18--->780
19--->735
20--->651
21--->540
22--->420
23--->305
24--->205
25--->126
26--->70
27--->35
28--->15
29--->5
30--->1
----------------------
6 dices.
6--->1
7--->6
8--->21
9--->56
10--->126
11--->252
12--->456
13--->756
14--->1161
15--->1666
16--->2247
17--->2856
18--->3431
19--->3906
20--->4221
21--->4332
22--->4221
23--->3906
24--->3431
25--->2856
26--->2247
27--->1666
28--->1161
29--->756
30--->456
31--->252
32--->126
33--->56
34--->21
35--->6
36--->1
----------------------
7 dices.
7--->1
8--->7
9--->28
10--->84
11--->210
12--->462
13--->917
14--->1667
15--->2807
16--->4417
17--->6538
18--->9142
19--->12117
20--->15267
21--->18327
22--->20993
23--->22967
24--->24017
25--->24017
26--->22967
27--->20993
28--->18327
29--->15267
30--->12117
31--->9142
32--->6538
33--->4417
34--->2807
35--->1667
36--->917
37--->462
38--->210
39--->84
40--->28
41--->7
42--->1
----------------------
8 dices.
8--->1
9--->8
10--->36
11--->120
12--->330
13--->792
14--->1708
15--->3368
16--->6147
17--->10480
18--->16808
19--->25488
20--->36688
21--->50288
22--->65808
23--->82384
24--->98813
25--->113688
26--->125588
27--->133288
28--->135954
29--->133288
30--->125588
31--->113688
32--->98813
33--->82384
34--->65808
35--->50288
36--->36688
37--->25488
38--->16808
39--->10480
40--->6147
41--->3368
42--->1708
43--->792
44--->330
45--->120
46--->36
47--->8
48--->1
----------------------
注意,当N>14时,f数组中的若干值会溢出。
【参考】
http://zhedahht.blog.163.com/blog/static/254111742009101524946359/
http://blog.csdn.net/wuzhekai1985/article/details/6640449
43. 动态规划求解n个骰子的点数和出现概率(或次数)[Print sum S probability of N dices]的更多相关文章
- 【剑指offer】面试题43:n个骰子的点数
第一种思路是,每一个骰子的点数从最小到最大,如果为1-6,那么全部的骰子从最小1開始,我们如果一种从左向右的排列,右边的最低,索引从最低開始,推断和的情况. def setTo1(dices, sta ...
- 《剑指offer》 面试题43 n个骰子的点数 (java)
引言:写这篇文章的初衷只是想做个笔记,因为这道题代码量有点大,有点抽象,而书上并没有详细的注释.为了加深印象和便于下次复习,做个记录. 原题:把n个骰子扔到地上,所有骰子朝上一面的点数之后为s. 输入 ...
- 43:n个骰子的点数
算法分析: 算法1.基于递归求色子点数,时间效率不高 现在我们考虑如何统计每一个点数出现的次数.要向求出n个骰子的点数和,可以先把n个骰子分为两堆:第一堆只有一个,另一个有n-1个.单独的那一个有可能 ...
- (剑指Offer)面试题43:n个骰子的点数
题目: 把n个骰子仍在地上,所有骰子朝上一面的点数之和为s.输入n,打印出s的所有可能的值出现的概率. 思路: s可能出现的值的范围为:n--6*n 1.全排列 回溯法枚举n个骰子(6面)的全排列,然 ...
- 剑指 Offer 60. n个骰子的点数 + 动态规划 + 空间优化
剑指 Offer 60. n个骰子的点数 Offer_60 题目详情 题解分析 package com.walegarrett.offer; /** * @Author WaleGarrett * @ ...
- 剑指Offer面试题43(Java版):n个骰子的点数
题目:把n个骰子仍在地上.全部骰子朝上一面的点数之和为s,输入n,打印出s的全部可能的值出现的概率. 解法一:基于递归求骰子的点数,时间效率不够高 如今我们考虑怎样统计每个点数出现的次数. 要向求出n ...
- 《剑指offer(第二版)》面试题60——n个骰子的点数
一.题目描述 把n个骰子仍在地上,所有的骰子朝上的一面的点数之和为s,输入n,打印出s所有可能的值出现的概率. 二.题解 <剑指offer>上给出的两种方法,尤其是代码,晦涩难懂且没有注释 ...
- 【编程题目】n 个骰子的点数
67.俩个闲玩娱乐(运算).2.n 个骰子的点数.把 n 个骰子扔在地上,所有骰子朝上一面的点数之和为 S.输入 n,打印出 S 的所有可能的值出现的概率. 思路:用递归把每个骰子的可能情况变量,记录 ...
- 【面试题043】n个骰子的点数
[面试题043]n个骰子的点数 题目: 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s, 输入n,打印出s的所有可能的值出现的概率. n个骰子的总点数,最小为n,最大为6n,根据排列组 ...
随机推荐
- Maven-本地安装
本文测试安装maven3 安装 Maven 之前要求先确定你的 JDK 已经安装配置完成.Maven是 Apache 下的一个项目,目前最新版本是 3.0.4,我用的也是这个. 首先去官网下载 ...
- 【CodeForces 297C】Splitting the Uniqueness
题意 序列s有n个数,每个数都是不同的,把它每个数分成两个数,组成两个序列a和b,使ab序列各自去掉个数后各自的其它数字都不同. 如果存在一个划分,就输出YES,并且输出两个序列,否则输出NO. 分析 ...
- Fence 设备
RHCS中必须有Fence设备,在设备为知故障发生时,Fence负责让占有浮动资源的设备与集群断开. REDHAT的fence device有两种, 内部fence设备: IBM RSAII卡,HP的 ...
- 【codevs1257】 打砖块
http://codevs.cn/problem/1257/ (题目链接) 题意 在等腰三角形上打砖块,总共有m发炮弹,每块砖有一个权值,求打出的最大权值 Solution 今天考试题,考场上的2个小 ...
- Java 对象的串行化(Serialization)
1.什么是串行化 对象的寿命通常随着生成该对象的程序的终止而终止.有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复.我们把对象的这种能记录自己的状态以便将来再生的能力.叫作对象的持续性(pe ...
- POJ 2481Cows(树状数组 + 好题)
Cows Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 15222 Accepted: 5070 Description ...
- jQuery EasyUI API 中文文档
http://www.cnblogs.com/Philoo/tag/jQuery/ 共2页: 1 2 下一页 jQuery EasyUI API 中文文档 - 树表格(TreeGrid) 风流涕淌 ...
- android 事件处理概念簇
1)事件传递函数 2)事件相关: 事件.事件源.事件监听器.MotionEvent 3)坐标系.定位.路由: 4)Window activity view viewGroup
- iOS 代理与block 逆向传值 学习
一般在项目中出现逆向传值的时候就需要用到代理.block 或者通知中心了.由于公司的项目底层封装的很好,所以项目做了三四个月就算碰到需要逆传的情况也不用自己处理.但是最近遇到了一个特别的情况就需要自己 ...
- route工具
route工具 route工具主要用来查看或修改内核路由表. 1.查看内核路由表 route [-nee] 参数说明: -n:不要使用协议或主机名称,直接使用 IP 或 port number:-ee ...