定义 d p [ i ] [ j ] dp[i][j] dp[i][j]表示剩下 i i i只白鼠和 j j j只黑鼠时 A A A获胜的概率
那 么 显 然 d p [ i ] [ 0 ] = 1 那么显然dp[i][0]=1 那么显然dp[i][0]=1,只有白鼠必胜
d p [ 0 ] [ i ] = 0 dp[0][i]=0 dp[0][i]=0,只有黑鼠必输
然后就可以开始愉快的 D P DP DP了
因为要么这次选的是白色,那么概率是 i i + j \frac{i}{i+j} i+ji
要么这次选的是黑色,对手也选的黑色,而且跑了黑色
要么这次选的是黑色,对手也选的黑色,而且跑了白色
这些就是 A A A获胜的所有可能了
总之状态定义才是关键,一开始我就想错了…
#include <bits/stdc++.h>
using namespace std;
int w,b;
double f[1009][1009];
int main()
{
cin >> w >> b;
for(int i=1;i<=w;i++) f[i][0]=1;
for(int i=1;i<=b;i++) f[0][i]=0;
for(int i=1;i<=w;i++)
for(int j=1;j<=b;j++)
{
double x=i*1.0,y=j*1.0;
f[i][j] = x*1.0/(x+y);//抽到白色
if( j>=3 )
f[i][j]+=f[i][j-3]*y*(y-1)*(y-2)/(x+y)/(x+y-1)/(x+y-2);
if( j>=2 )//黑,黑,白
f[i][j]+=f[i-1][j-2]*y*(y-1)*x/(x+y)/(x+y-1)/(x+y-2);
}
printf("%.9lf",f[w][b] );
}