POJ 2096 Collecting Bugs(期望+DP)

题目链接:http://poj.org/problem?id=2096

题意:一个软件的bug有两个分类标准,按照一种分为n类,按照另一种分为m类。已知任意一个bug必然属于n类中的一种,同时也属于m类中的一种。已知每天可以找到一个bug。问需要多少天可以找全n类和m类bug?

思路:f[x][y]表示找到x个n类y个m类的期望,则f[x][y]=1+(n-x)*(m-y)/(n*m)*f[x][y]+(n-x)*y/(n*m)*f[x][y-1]+x*(m-y)/(n*m)*f[x-1][y]+x*y/(n*m)*f[x-1][y-1]。





int n,m;

double f[1005][1005];





double DFS(int x,int y)

{

    if(f[x][y]>-1) return f[x][y];

    double temp;

    if(x==0)

    {

        if(y==0) f[x][y]=0;

        else

        {

            temp=1.0*y/m*DFS(x,y-1);

            f[x][y]=(1+temp)/(1-1.0*(m-y)/m);

        }

    }

    else

    {

        if(y==0)

        {

            temp=1.0*x/n*DFS(x-1,y);

            f[x][y]=(1+temp)/(1-1.0*(n-x)/n);

        }

        else

        {

            temp=0;

            temp+=1.0*(n-x)/n*y/m*DFS(x,y-1);

            temp+=1.0*x/n*(m-y)/m*DFS(x-1,y);

            temp+=1.0*x/n*y/m*DFS(x-1,y-1);

            f[x][y]=(1+temp)/(1.0-1.0*(n-x)*(m-y)/(n*m));

        }

    }

    return f[x][y];

}



int main()

{

    Rush(n)

    {

        clr(f,-1);

        RD(m);

        PR(DFS(n,m));

    }

    return 0;

}

  

你可能感兴趣的:(bugs)