题目分析
用dp[i][j][0]表示i只白鼠、j只 黑鼠、公主先手时公主赢的概率,而相应的dp[i][j][1]则为公主后手。
本题状态想麻烦了,其实dp[i][j]也可推,这种两个交替的可以多想一步的。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
const double eps=1e-9;
const int maxn=1005;
double dp[maxn][maxn][2];
int w,b;
int main()
{
cin>>w>>b;
dp[0][0][0]=0;
dp[0][0][1]=0;
for(int i=1;i<=w;i++)
{
dp[i][0][0]=1;
dp[i][0][1]=0;
}
for(int j=1;j<=b;j++)
{
dp[0][j][0]=0;
dp[0][j][1]=0;
}
for(int i=1;i<=w;i++)
for(int j=1;j<=b;j++)
{
dp[i][j][0]=(i+0.0)/(i+j)+(j+0.0)/(i+j)*dp[i][j-1][1];
if(j>1) dp[i][j][1]=(j+0.0)/(i+j)*
(
(i+0.0)/(i+j-1)*dp[i-1][j-1][0]+
(j-1.0)/(i+j-1)*dp[i][j-2][0]//注意这里也要乘上各自的概率
);
else dp[i][j][1]=(j+0.0)/(i+j)*dp[i-1][j-1][0];
}
printf("%.11f\n",dp[w][b][0]);
return 0;
}