求概率 Bag of mice CodeForces

题意:袋子里有w只白鼠和b只黑鼠。龙和公主轮流从袋子里抓老鼠。谁先抓到白色老师谁就赢。公主每次抓一只老鼠,龙每次抓完一只老鼠之后会有一只老鼠跑出来。每次抓老鼠和跑出来的老鼠都是随机的。如果两个人都没有抓到白色老鼠则龙赢。公主先抓。问公主赢的概率。

dp[i][j]表示有i只白鼠和j只黑鼠公主赢的概率。(可以由三种情况组成)

1.公主抓了白鼠。dp[i][j]=i/i+j;

公主抓了黑鼠,龙也抓了黑鼠 (j>=2):

2.跳出去的是白鼠  dp[i][j]+=j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)*dp[i-1][j-2];

3.当j>3时,跳出去的是黑鼠  dp[i][j]+=j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2)*dp[i][j-3];

注意处理好边界情况.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
double dp[1005][1005];
int main()
{
    int w,b;
    while(scanf("%d%d",&w,&b)!=EOF)
    {   
        memset(dp,0,sizeof(dp));
    for(int i=0;i<=b;i++)
        dp[0][i]=0.0;
    for(int i=0;i<=w;i++)
        dp[i][0]=1.0;
        dp[0][0]=0;
    for(int i=1;i<=w;i++)
        for(int j=1;j<=b;j++)
    {
       dp[i][j]+=(double)i/(i+j);
       if(j>=2) dp[i][j]+=(double)j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)*dp[i-1][j-2];
       if(j>=3) dp[i][j]+=(double)j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2)*dp[i][j-3];
    }
        
    }
 
    printf("%.9f
",dp[w][b]);
    return 0;
}

  

原文地址:https://www.cnblogs.com/Twsc/p/6739605.html