1. 程式人生 > >【HDU4652】Dice(數學期望,動態規劃)

【HDU4652】Dice(數學期望,動態規劃)

題面

Vjudge
有一個m面骰子
詢問,連續出現n個相同的時候停止的期望
連續出現n個不同的時候停止的期望

題解

考慮兩種分開詢問來算。

第一種:
f[i]表示已經有連續的i個相同時,到達目標狀態的期望。

f[i]=1mf[i+1]+m1mf[1]+1
相鄰兩項作差,得到
m(f[i+1]f[i])=f[i+2]f[i+1]
按照順序列出來
f[0]f[1]=1
f[1]f[2]=m
f[2]f[3]=m2

f[n1]f[n]=mn1
將所有式子相加起來
f[0]f[n]=mn11m
f[n]=0,這樣就知道了f[0]
所以
A
ns=f[0]=mn11m

考慮第二種詢問
f[i]表示連續i個不同的數字,到達目標狀態的期望

f[i]=mimf[i+1]+f[1]+f[2]+f[3]+...f[i1]+f[i]m
還是相鄰兩項作差讓後相加,算出答案
Ans=i=0n1j=0immj
#include<cstdio>
#include<cmath>
using namespace std;
double Solve1(int m,int n){return (pow(m,n)-1.0)/(m-1.0);}
double Solve2(int m,int n)
{
    double
ret=1,d=1; for(register int j=1;j<n;++j)d=1.0*m/(m-j)*d,ret+=d; return ret; } int main() { register int T,opt,n,m; while(scanf("%d",&T)!=EOF)while(T--) { scanf("%d%d%d",&opt,&m,&n); printf("%.9lf\n",!opt?Solve1(m,n):Solve2(m,n)); } }