题解:概率与期望DP
f[i][j]表示一共有i只老鼠,有j只是白老鼠的概率。
递推f数组的时候,强制抓出的一定是黑老鼠(即此时游戏不能结束),但是在跳出的时候是等概率的。
ans+=f[i][j]*(i/j) 保证该状态该第一个人抓老鼠。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 2003
using namespace std;
int n,m;
double f[N][N];
int main(){
freopen("a.in","r",stdin);
scanf("%d%d",&n,&m);
f[n+m][n]=1;
for (int i=n+m;i>=1;i--)
for (int j=min(i,n);j>=1;j--) {
int t=(n+m-i)%3;
double p=((i-j)?(i-j)*1.0/i:0); double q=j*1.0/i;
if (t!=2) f[i-1][j]+=f[i][j]*p;
else f[i-1][j]+=(double)f[i][j]*p,f[i-1][j-1]+=(double)f[i][j]*q;
//cout<<f[i-1][j]<<endl;
}
double ans=0;
for (int i=n+m;i>=1;i--)
for (int j=min(i,n);j>=1;j--) {
int t=(n+m-i)%3; double p=j*1.0/i;
// cout<<f[i][j]<<endl;
if (t==0) ans+=f[i][j]*p;
}
printf("%.9lf\n",ans);
}