原来袋子里有w只白鼠和b只黑鼠
龙和王妃轮流从袋子里抓老鼠。谁先抓到白色老师谁就赢。
王妃每次抓一只老鼠,龙每次抓完一只老鼠之后会有一只老鼠跑出来。
每次抓老鼠和跑出来的老鼠都是随机的。
如果两个人都没有抓到白色老鼠则龙赢。王妃先抓。
问王妃赢的概率。
思路:
设dp[i][j]表示有i个白鼠,j个黑鼠时王妃赢的概率,则dp[1][0]为必胜点。
dp[i][0]=1,3种情况,推一遍就出来了
1.两人都拿黑的并且逃跑的也是黑的:dp[i][j-3]*(1.0*j/(i+j))*(1.0*(j-1)/(i+j-1))*(1.0*(j-2)/(i+j-2))
2.两人都拿黑的逃跑的是白的:dp[i-1][j-2]*(1.0*j/(i+j))*(1.0*(j-1)/(i+j-1))*(1.0*i/(i+j-2))
3.赢了:1.0*i/(i+j)
注意i j为整形,要转化为double才能运算。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
using namespace std;
const int N=1005;
const double eps=1e-5;
int w,b;
double dp[N][N];
int main()
{
scanf("%d%d",&w,&b);
memset(dp,0,sizeof(dp));
dp[1][0]=1;
for(int i=0;i<=w;i++){
for(int j=0;j<=b;j++){
if(i==1&&j==0)continue;
if(j>=3)
dp[i][j]+=dp[i][j-3]*(1.0*j/(i+j))*(1.0*(j-1)/(i+j-1))*(1.0*(j-2)/(i+j-2));
if(i>=1&&j>=2)
dp[i][j]+=dp[i-1][j-2]*(1.0*j/(i+j))*(1.0*(j-1)/(i+j-1))*(1.0*i/(i+j-2));
if(i>=1)
dp[i][j]+=1.0*i/(i+j);
}
}
printf("%.10f\n",dp[w][b]);
return 0;
}