题意:
有a只白老鼠,b只黑老鼠,A先抓,B后抓,只要有一个人先抓住老鼠,游戏就结束了。每次当B抓住一只老鼠且游戏还没结束时,就睡会逃出一只老鼠。问A抓住老鼠的期望值为多少。(如果都没抓住,A不算赢)
思路:
设f[a][b]为还剩a只白老鼠,b只黑老鼠时的期望,设定此时的含义是在A先抓,B后抓的条件下成立。
给出两个边界条件:
1.f[0][i]=0
2.f[i][0]=1
对于f[i][j]来说,f[i][j]=f[i-2][j-1]+f[i][j-3]+此时A直接抓到白老鼠的概率。
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int a,b;
double inf,f[N][N];
double dfs(int aa,int bb)
{
if (f[aa][bb]!=inf) return f[aa][bb];
if (!aa) {f[aa][bb]=0; return 0;}
if (!bb) {f[aa][bb]=1; return 1;}
double ans=0;
double a=double(aa);
double b=double(bb);
ans+=a/(a+b);
if (b-3>=0) ans+=b/(a+b)*(b-1)/(a+b-1)*(b-2)/(a+b-2)*dfs(a,b-3);
if (a-1>=0 && b-2>=0) ans+=b/(a+b)*(b-1)/(a+b-1)*a/(a+b-2)*dfs(a-1,b-2);
f[aa][bb]=ans;
return f[aa][bb];
}
int main(){
inf=-2e9;
scanf("%d%d",&a,&b);
for (register int i=0; i<=a; ++i)
for (register int j=0; j<=b; ++j) f[i][j]=inf;
printf("%.10f\n",dfs(a,b));
return 0;
}