LintCode 20 骰子求和

题目:dicesSum


要求:

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

样例:

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

算法要求:

解题思路:

刚开始的时候,用的时模拟投掷的方法,结果只能计算3个骰子的概率。后来在1,2,3骰子的概率分布中发现了规律。
现在我把分布图发一下,大家看看有没有什么规律
前面为总和,后面为次数
    1 1         2 1         3 1
    2 1         3 2         4 3
    3 1         4 3         5 6
    4 1         5 4         6 10
    5 1         6 5         7 15
    6 1         7 6         8 21
                8 5         9 25
                9 4         10 27
                10 3        11 27
                11 2        12 25
                12 1        13 21
                            14 15
                            15 10
                            16 6
                            17 3
                            18 1
分别是1,2,3个骰子的次数。
可以看出,最小的点数都是骰子的个数,最大是骰子的个数 * 6。
再看一下,1个骰子和2个骰子的差距和联系。
拿2个骰子的分布表来说,总和为2的次数为1次,总和为3的次数为2次,依次到总和为8的时候,发现次数为5,先把疑问放在这里,等会回头来看。
接着看2个骰子和3个骰子,总和为3的次数为1,总和为4的次数为3,依次到总和为9的时候,次数为25,本来以为1,3,6,10,15,21发现规律了,其实不然,我为什么说要1和2一起看,2和3一起看呢?
现在将上面2次观察的结果拿在一起看一看,能不能发现什么规律。
2个骰子总和为8的次数为1+1+1+1+1=5,总和为7的次数为1+1+1+1+1+1=6,那么看一下3个骰子总和为9的次数为2+3+4+5+6+5=25,看一下总和为8的次数为1+2+3+4+5+6=21,是不是发现了规律。如果发现了规律,读者可以拿纸写一下4个骰子的分布图(最下面会贴出来4个骰子的分布图)。
如果读到这里明白了,理解了,还不会写,那就再从头看一遍吧。。

算法如下:

    double setDoublePrecision(double d, int n) {
        int temp = d * pow(10.0, n + 3);
        if (temp % 1000 >= 499) {
            temp -= temp % 1000;
            temp += 1000;
        } else {
            temp -= temp % 1000;
        }
        return temp / pow(10.0, n + 3);
    }
    vector<pair<int, double> > dicesSum(int n) {
        vector<pair<int, double> > vec;
        double m = pow(6, n);
        double time[n*6 + 1][2];
        int last = 0;
        int now = 1;
        for (int i = 1; i < n*6 + 1; i++) {
            time[i][now] = 1;
            time[i][last] = 0;
        }
        for (int i = 2; i <= n; i++) {
            now += last;
            last = now - last;
            now -= last;
            for (int j = i; j <= i * 6; j++) {
                time[j][now] = 0;
                for (int k = 1; k <= 6; k++) {
                    if (j - k >= i - 1 && j - k <= i * 6 - 6) {
                        time[j][now] += time[j - k][last];
                    }
                }
            }
        }
        for (int k = n; k < n * 6 + 1; k++) {
            pair<int, double> p;
            p.first = k;
            p.second = setDoublePrecision(time[k][now]/m, 2);
            vec.push_back(p);
        }
        return vec;
    }

补充

下面是4个骰子的,再贴出来一个50个骰子的
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
下面是50个骰子的
50 1
51 50
52 1275
53 22100
54 292825
55 3162510
56 28989625
57 231914900
58 1652347725
59 10647768950
60 62813715055
61 342541999800
62 1740609487750
63 8296685434100
64 37304646580950
65 158986583237720
66 644904877837675
67 2498811917115150
68 9277831691788626
69 33101351125269696
70 113764520658466976
71 377476626974430656
72 1211593153497251584
73 3768628305246631936
74 11378155871775318016
75 33393380471906709504
76 95395995450714177536
77 265590574632587362304
78 721431910629076369408
79 1913931800948690124800
80 4963857329320916680704
81 12596673223965173350400
82 31303298093558186115072
83 76234330902364713648128
84 182071961274947907616768
85 426729346091376665690112
86 982075885190556587917312
87 2220596476799779124281344
88 4935823184961990272483328
89 10790307510515880129724416
90 23211226913564756472233984
91 49152553393707374474166272
92 102508598441588312657362944
93 210626474945547923387056128
94 426546898750778958260731904
95 851678505278677960812920832
96 1677202041057965913071943680
97 3258622175839215696098623488
98 6248167006619980609842315264
99 11826758184971481912837144576
100 22105054690914109051786756096
101 40807766889960957171640303616
102 74426331366143498666393993216
103 134135917079908275320791236608
104 238943734726994109399023222784
105 420795669863941446284232097792
106 732758215324367850067955023872
107 1261969259771325128085604401152
108 2149891831514317318666491789312
109 3623612879581447239348864942080
110 6043640346604650949260045451264
111 9976040508464536697090063990784
112 16300042701998167798456105566208
113 26366688036068095922448199843840
114 42230031124767134932033521844224
115 66980185783001117781688972214272
116 105217541543334346970712216961024
117 163720191094905172618374029508608
118 252372409575413793194274900148224
119 385441265120671675208073406840832
120 583311340952280287154631188938752
121 874814127386972787738765074366464
122 1300318598090814484648122082394112
123 1915782083369040976180865837039616
124 2797994489233293584610913146634240
125 4051282172863713527645763843129344
126 5815967528628700696614541207797760
127 8278902789701428938737899613978624
128 11686406958072359501084195305816064
129 16359927445172843359078204624076800
130 22714716432711158094504151062937600
131 31281749104483644316352213281669120
132 42733009591776564311023597062717440
133 57910124024005790326366984747352064
134 77856123013322064311823247781920768
135 103849864884592972506473858271805440
136 137442345783118050884988130715238400
137 180493767427391277724992029904076800
138 235209836877307326842264992954187776
139 304175350418849666956651117276037120
140 390382687215016679008612838793019392
141 497252436045344038915076182547365888
142 628643034682218344840100598201188352
143 788846055605075602315290445296435200
144 982563666214909024696219498310533120
145 1214864869165193850303792198319079424
146 1491117428450357943814892549507645440
147 1816892942006990206009991699858718720
148 2197843352983018546169207711453937664
149 2639548305161884949689113647360507904
150 3147334129588464359562096047565045760
151 3726066863256740511750802106673528832
152 4379923486946076221727303621261918208
153 5112147444366405114027240834174287872
154 5924796363582303813065557156372152320
155 6818491621976713107237380706334146560
156 7792180844982473590887686256319266816
157 8842925471658356937798517720453480448
158 9965726030187900697398975314572345344
159 11153397635757119137731885728008241152
160 12396507374046471384208177845239808000
161 13683383627432368228696558686145871872
162 15000205047112809379804266437757894656
163 16331173834333526764862981969973084160
164 17658774382872218649252361819920531456
165 18964114318679270097659414738758533120
166 20227340759956928081916101736418770944
167 21428120452432806847299035547238924288
168 22546168567052286915005973893413339136
169 23561807636520859357989241316291117056
170 24456535588845715475244717094289276928
171 25213580307592797778918949646430633984
172 25818417752360614623609320814925578240
173 26259231483293091467107946679070883840
174 26527293448223798880814724639153455104
175 26617249029052548232041745031318470656
176 26527293448223808325547690378443882496
177 26259231483293091467107946679070883840
178 25818417752360614623609320814925578240
179 25213580307592797778918949646430633984
180 24456535588845715475244717094289276928
181 23561807636520859357989241316291117056
182 22546168567052286915005973893413339136
183 21428120452432806847299035547238924288
184 20227340759956930443099343171241377792
185 18964114318679272458842656173581139968
186 17658774382872218649252361819920531456
187 16331173834333529126046223404795691008
188 15000205047112811740987507872580501504
189 13683383627432372951063041555791085568
190 12396507374046473745391419280062414848
191 11153397635757121498915127162830848000
192 9965726030187904239173837466806255616
193 8842925471658358118390138437864783872
194 7792180844982474771479306973730570240
195 6818491621976713107237380706334146560
196 5924796363582303813065557156372152320
197 5112147444366403343139809758057332736
198 4379923486946075041135682903850614784
199 3726066863256739331159181389262225408
200 3147334129588464359562096047565045760
201 2639548305161884064245398109302030336
202 2197843352983018251021302532101111808
203 1816892942006989615714181341153067008
204 1491117428450357943814892549507645440
205 1214864869165193555155887018966253568
206 982563666214909024696219498310533120
207 788846055605075749889243034972848128
208 628643034682218418627076893039394816
209 497252436045344186489028772223778816
210 390382687215016826582565428469432320
211 304175350418849740743627412114243584
212 235209836877307363735753140373291008
213 180493767427391277724992029904076800
214 137442345783118106225220351843893248
215 103849864884593009399962005690908672
216 77856123013322082758567321491472384
217 57910124024005799549739021602127872
218 42733009591776564311023597062717440
219 31281749104483644316352213281669120
220 22714716432711162706190169490325504
221 16359927445172847970764223051464704
222 11686406958072361806927204519510016
223 8278902789701431244580908827672576
224 5815967528628703002457550421491712
225 4051282172863714104106516146552832
226 2797994489233293584610913146634240
227 1915782083369041552641618140463104
228 1300318598090815061108874385817600
229 874814127386972931853953150222336
230 583311340952280503327413302722560
231 385441265120671747265667444768768
232 252372409575413865251868938076160
233 163720191094905208647171048472576
234 105217541543334382999509235924992
235 66980185783001126788888226955264
236 42230031124767125924834267103232
237 26366688036068095922448199843840
238 16300042701998167798456105566208
239 9976040508464536697090063990784
240 6043640346604650949260045451264
241 3623612879581446113448958099456
242 2149891831514317318666491789312
243 1261969259771324705873139335168
244 732758215324367568592978313216
245 420795669863941375915487920128
246 238943734726994039030279045120
247 134135917079908275320791236608
248 74426331366143481074207948800
249 40807766889960948375547281408
250 22105054690914104653740244992
251 11826758184971477514790633472
252 6248167006619977311307431936
253 3258622175839215696098623488
254 1677202041057966187949850624
255 851678505278678235690827776
256 426546898750778958260731904
257 210626474945547992106532864
258 102508598441588312657362944
259 49152553393707365884231680
260 23211226913564756472233984
261 10790307510515880129724416
262 4935823184961989198741504
263 2220596476799779661152256
264 982075885190556587917312
265 426729346091376732798976
266 182071961274947907616768
267 76234330902364713648128
268 31303298093558190309376
269 12596673223965169156096
270 4963857329320917729280
271 1913931800948690386944
272 721431910629076369408
273 265590574632587427840
274 95395995450714210304
275 33393380471906701312
276 11378155871775313920
277 3768628305246631936
278 1211593153497251584
279 377476626974430528
280 113764520658466960
281 33101351125269700
282 9277831691788624
283 2498811917115150
284 644904877837675
285 158986583237720
286 37304646580950
287 8296685434100
288 1740609487750
289 342541999800
290 62813715055
291 10647768950
292 1652347725
293 231914900
294 28989625
295 3162510
296 292825
297 22100
298 1275
299 50
300 1
有兴趣的可以弄200个骰子的,有能力的可以写出来10000个骰子的,需要用的高精度运算。所以以后大家玩骰子,一般都是靠中间的点数几率大喔~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值