Codeforces 148 D Bag of mice(概率DP)

来源:互联网 发布:java中1到100的质数 编辑:程序博客网 时间:2024/06/04 01:26

思路:用dp[i][j]表示有i只白鼠,j只黑鼠;那么可以分为三种情况。1.公主第一次就抓到白鼠,dp[i][j]+=i/(i+j); 2.公主抓黑鼠,龙王抓黑鼠,一只黑鼠跳出来,dp[i][j]+=(((j/(i+j))*((j-1)/(i+j-1))*((j-2)/(i+j-2)))*dp[i][j-3],当然还得满足j>=3; 3.公主抓黑鼠,龙王抓黑鼠,一只白鼠跳出来,dp[i][j]=(((j/(i+j))*((j-1)/(i+j-1))*(i/(i+j-2)))*dp[i-1][j-2],j>=2.

#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn=1008;int w,b;double dp[maxn][maxn];int main(){    while(cin>>w>>b)    {        memset(dp,0,sizeof(dp));        for(int i=1;i<=w;i++)        {            dp[i][0]=1;        }        for(int j=0;j<=b;j++)        {            dp[0][j]=0;        }        for(int i=1;i<=w;i++)        {            for(int j=1;j<=b;j++)            {                dp[i][j]+=(double)i/(i+j);                if(j>=3) dp[i][j]+=(((double)j/(i+j))*((double)(j-1)/(i+j-1))*((double)(j-2)/(i+j-2)))*dp[i][j-3];                if(j>=2) dp[i][j]+=(((double)j/(i+j))*((double)(j-1)/(i+j-1))*((double)i/(i+j-2)))*dp[i-1][j-2];            }        }        printf("%.9f\n",dp[w][b]);    }    return 0;}



0 0
原创粉丝点击