回数の期待値の問題 - 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]));
}