UVA 11427 (概率DP+期望)

题目链接http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=35396

题目大意:每晚打游戏。每晚中,赢一局概率p,最多玩n局,如果最后不能保证胜率大于p,则从此不玩。问打游戏的天数的期望。

解题思路

首先分析每天晚上的。

设f[i][j]为前i天,已经赢j局的概率。

 由全概率公式,那么当天晚上完蛋的概率q=f[n][0]+f[n][1]+.....f[n][终止条件].

至于为什么从完蛋(输)的角度考虑,主要是由于n局的条件存在,最多n局很容易解,而n局中赢局的最大递推范围,就是0~( j/i<=a*i)

若从当晚不完蛋的角度考虑,则赢局的范围不好确定。

最后每天晚上完蛋概率q=f[n][0~n],(后面没推是0,所以这里偷懒取n就行)

 

打游戏的天数问题,是个离散型期望问题。

X 1 2 3 4 5
P Q Q(1-Q) Q*(1-Q)^2 Q*(1-Q)^3 Q*(1-Q)^4
EX 1*Q 2*Q(1-Q) 3*Q*(1-Q)^2 4*Q*(1-Q)^3 5*Q*(1-Q)^4

则EX=Q+2*Q(1-Q)+3*Q*(1-Q)^2+.....

是个无穷级数,不好求和。

对这个数列进行变形:设x=EX/Q,则x=1+2(1-Q)+3*(1-Q)^2+..., ①

                                                则(1-Q)x=(1-Q)+2*(1-Q)^2+... ②

①-②=EX=Qx=1+(1-Q)+(1-Q)^2+.... ,设1-Q=K

对这个等比数列求和,EX=lim (1-K^n)/(1-K)=1/(1-K)=1/Q。

 

还有一种奇葩的思考方式,设最后期望为e。

设事件A为第一天完蛋。那么P(A=1):Q,期望是1。P(A=0):1-Q,期望e+1,e=Q+(1-Q)*(e+1),e=1/Q.

至于为什么第一天不完蛋则期望是e+1。(=。=暂时没想出来)

 

#include "cstdio"

#include "cstring"

#define maxn 105

double f[maxn][maxn];

int main()

{

    //freopen("in.txt","r",stdin);

    int T,n,a,b,no=0;

    double p;

    scanf("%d",&T);

    while(T--)

    {

        memset(f,0,sizeof(f));

        scanf("%d/%d%d",&a,&b,&n);

        p=(double)a/b;

        f[0][0]=1;f[0][1]=0;

        for(int i=1;i<=n;i++)

          for(int j=0;j*b<=a*i;j++)

        {

            if(!j) f[i][j]=f[i-1][j]*(1-p);

            else f[i][j]=f[i-1][j]*(1-p)+f[i-1][j-1]*p;

        }

        double q=0;

        for(int i=0;i<=n;i++) q+=f[n][i];

        printf("Case #%d: %d\n",++no,int(1/q));

    }

}

 

你可能感兴趣的:(uva)