戳我

定义 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] );
}