如題所說(shuō):
像大富翁一樣,擲骰子,按骰子的點(diǎn)數(shù),走步數(shù),計(jì)算走到第n格的概率是多少?
例如我們的這個(gè)函數(shù)dp(n)計(jì)算的是第n格的概率,則:
//骰子點(diǎn)數(shù)必須為(1),這1種可能
p(1)=第1格的概率=1/6
//骰子點(diǎn)數(shù)必須為(2),(1,1),兩種可能
p(2)=第2格的概率=1/6+(1/6)(1/6)
//骰子點(diǎn)數(shù)(3),(1,2),(2,1),(1,1,1)
p(3)=第3格的概率=1/6+(1/6)(1/6)2+(1/6)(1/6)*(1/6)
第4個(gè)的排列組合實(shí)在是太多了,這里我就不繼續(xù)列舉了
我們來(lái)分析一下,這個(gè)p(n)改如何計(jì)算,第n格的概率其實(shí)是第n-6格到第n-1格,整體計(jì)算出來(lái)的
如果n<6則:
p(1)=1/6
p(2)=p(1)/6+1/6
p(3)=p(1)/6+p(2)/6+1/6
...
如果n>6則:
p(n)=p(n-1)/6+p(n-2)/6+p(n-3)/6+p(n-4)/6+p(n-5)/6+p(n-6)/6
則我們只需要從1開(kāi)始算概率,
計(jì)算1的概率時(shí),必須將第一格對(duì)2-7格的概率的影響也計(jì)算出來(lái)
p(n+1)+=p(n)/6
具體算法如下:
public static double p(int n){
if(n<=0||n>64){
return 0;
}
double arr[] = new double[64];
for(int i = 0;i<64;i++){
if(i<6){
arr[i]+=1.0/6;
}
for(int j=1;j<7;j++){
if(i+j<64)
arr[i+j]+=arr[i]/6.0;
}
}
return arr[n-1];
}