ZOJ 3329 One Person Game(带环的期望)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3754

题意:有3个筛子,分别有k1,k2,k3个面。每次掷筛子,如果三个面为指定的a,b,c,则分数置0,否则分数加上三个筛子的和。当总分大于n时结束。求游戏结束掷筛子次数的期望。

思路:E[i]=sum(E[i+k]*Pk)+E[0]*P0+1(E[i]表示当前分数为i到达结束的期望,Pi表示一次掷筛子得到i的概率)。那么答案就是E[0]。设E[i]=A[i]*E[0]+B[i],带入得到:E[i]=sum(A[i+k]*Pk+P0)*E[0]+sum(B[i+k]*Pk)+1,得到:A[i]=sum(A[i+k]*Pk+P0),B[i]=sum(B[i+k]*Pk)+1。答案为:B[0]/(1-A[0])。

 





int n,k1,k2,k3,a,b,c;

double p[N],A[N],B[N];







int main()

{

    rush()

    {

        RD(n);

        RD(k1,k2,k3);

        RD(a,b,c);

        double one=1.0/(k1*k2*k3);

        int i,j,k;

        clr(p,0);

        FOR1(i,k1) FOR1(j,k2) FOR1(k,k3)

        {

            if(i==a&&j==b&&k==c) continue;

            p[i+j+k]+=one;

        }

        clr(A,0); clr(B,0);

        FORL0(i,n)

        {

            for(j=3;j<=k1+k2+k3&&i+j<=n;j++)

            {

                A[i]+=A[i+j]*p[j];

                B[i]+=B[i+j]*p[j];

            }

            A[i]+=one;

            B[i]+=1;

        }

        PR(B[0]/(1-A[0]));

    }

    return 0;

}

 

  

 

你可能感兴趣的:(game)