#include <cstdio>
#include <cstring>
const int maxn = 1E3 + 10;
int w, b;
double dp[maxn][maxn];
int main(int argc, char const *argv[])
{
while (scanf("%d%d", &w, &b) != EOF)
{
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= w; i++) dp[i][0] = 1;
for (int i = 1; i <= w; i++)
for (int j = 1; j <= b; j++)
{
dp[i][j] += double(i) / (i + j);
if (j >= 3) dp[i][j] += double(j) / (i + j) * double(j - 1) / (i + j - 1) * double(j - 2) / (i + j - 2) * dp[i][j - 3];
if (j >= 2) dp[i][j] += double(j) / (i + j) * double(j - 1) / (i + j - 1) * double(i) / (i + j - 2) * dp[i - 1 ][j - 2];
}
printf("%.9lf\n", dp[w][b]);
}
return 0;
<p>}</p>
设dp[i][j]表示现在轮到王妃抓时有i只白鼠,j只黑鼠,王妃赢的概率
明显 dp[0][j]=0,0<=j<=b;因为没有白色老鼠了
dp[i][0]=1,1<=i<=w;因为都是白色老鼠,抓一次肯定赢了。
dp[i][j]可以转化成下列四种状态:
1、王妃抓到一只白鼠,则王妃赢了,概率为i/(i+j);
2、王妃抓到一只黑鼠,龙抓到一只白色,则王妃输了,概率为j/(i+j)*i/(i+j-1).
3、王妃抓到一只黑鼠,龙抓到一只黑鼠,跑出来一只黑鼠,则转移到dp[i][j-3]。
概率为j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2);
4、王妃抓到一只黑鼠,龙抓到一只黑鼠,跑出来一只白鼠,则转移到dp[i-1][j-2].
概率为j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2);