原來袋子裏有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;
}