设dp[i][j] 为剩余i个白球,j个黑球的公主的胜率。
可以推出公式 dp[i][j] = 1.0*i / (i + j) + 1.0*j * (j - 1) * (i*dp[i-1][j-2] + (j - 2) * dp[i][j-3]) / (i + j) / (i + j - 1) / (i + j - 2) 。
注意一下边界。
代码:
#include<cstdio>
#include<iostream>
using namespace std;
const int maxn = 1005;
double dp[maxn][maxn];
int w,b;
int main(){
scanf("%d%d",&w,&b);
for(int i=0;i<=w;i++){
for(int j=0;j<=b;j++){
if(i == 0){
dp[i][j] = 0;continue;
}
if(j == 0){
dp[i][j] = 1;continue;
}
if(j == 1){
dp[i][j] = 1.0*i / (i + j);continue;
}
if(j == 2){
dp[i][j] = 1.0*i / (i + j) + 1.0* j * (j - 1) * dp[i-1][j-2] / (i + j) / (i + j - 1);continue;
}
dp[i][j] = 1.0*i / (i + j) + 1.0*j * (j - 1) * (i*dp[i-1][j-2] + (j - 2) * dp[i][j-3]) / (i + j) / (i + j - 1) / (i + j - 2);
}
}
printf("%.9f\n",dp[w][b]);
return 0;
}