回数の期待値の問題 - YukiCoder #75
確率弱いのです.色々解法があるらしいので理解しなきゃ.
E[i]を和がiになってから,和をKにするために振る回数の期待値とします..
このE[i]をF[i]E[0]+G[i]の形にできれば,E[0] = F[0]E[0] + G[0]なので,
E[0] = G[0]/(1-F[0])
で答えが出ます.
これはE[K]=0からF[K]=0,G[K]=0が分かっているので,逆順に(i=Kからi=0へ)計算するとできます.
#include <cstdio> int K; double F[201], G[201]; int main(){ scanf("%d", &K); F[K] = 0.0f; G[K] = 0.0f; for(int i=K-1;i>=0;i--){ for(int j=1;j<=6;j++){ if(i+j <= K){F[i] += 1.0f/6.0f * F[i+j]; G[i] += 1.0f/6.0f * G[i+j];} else{F[i] += 1.0f/6.0f;} } G[i] += 1.0f; } printf("%.30f\n", G[0] / (1.0f-F[0])); }