题意:袋子里有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;
}