用d[i][j]表示princess面对的状态还剩i个白老鼠和j个黑老鼠的时候能win的概率。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
double d[1010][1010]={0};
int w, b;
void dp()
{
for(int i=1; i<=w; i++)
d[i][0]=1.0;
for(int i=1; i<=w; i++)
for(int j=1; j<=b; j++)
{
//princess拿到白老鼠的概率
d[i][j]=1.0*i/(i+j);
//princess拿到黑老鼠,dragon拿到黑老鼠,跳出一只白老鼠后,princess能赢的概率
if(j>=2)
d[i][j]+=1.0*j/(i+j)* d[i-1][j-2] *i*(j-1)/((i+j-1)*(i+j-2));
//princess拿到黑老鼠,dragon拿到黑老鼠,跳出一只黑老鼠后,princess能赢的概率
if(j>=3)
d[i][j]+=1.0*j/(i+j)* d[i][j-3]*(j-2)*(j-1)/((i+j-1)*(i+j-2));
}
printf("%.9lf\n", d[w][b]);
}
int main()
{
scanf("%d%d", &w, &b);
dp();
return 0;
}