递推公式:now[ i ][ j ]=i / ( i + j ) + (( j / ( i + j ) ) * ( ( j - 1 ) / ( i + j - 1 ) ) ) * ( ( i /( i + j - 2 ) ) * now [ i - 1 ][ j - 2 ] + ( ( j - 2 ) / ( i + j - 2 ) ) * now[ i ][ j - 3 ] )
now[ i ][ j ]代表公主面对 i 个白老鼠和 j 个黑老鼠赢的概率
赢的可能有当前就选到白老鼠,以及公主选到黑老鼠后,龙选黑老鼠 跑白老鼠或者龙选黑老鼠 跑黑老鼠 然后公主选白老鼠赢
#include<stdio.h>
#include<algorithm>
using namespace std;
double now[1005][1005];
int main()
{
int i,j,w,b;
scanf("%d %d",&w,&b);
for(i=0;i<=w;i++)
now[i][0]=1;
for(i=0;i<=b;i++)
now[0][i]=0;
for(i=1;i<=w;i++)
{
for(j=1;j<=b;j++)
{
now[i][j]=i*1.0/(i+j)*1.0;
double t=0;
if(j>=2)
{
t+=(i*1.0/(i+j-2)*1.0)*now[i-1][j-2];
}
if(j>=3)
{
t+=((j-2)*1.0/(i+j-2)*1.0)*now[i][j-3];
}
now[i][j]+=(j*1.0/(i+j)*1.0)*((j-1)*1.0/(i+j-1)*1.0)*t;
}
}
printf("%.9lf\n",now[w][b]);
}