题目链接:戳这里
题解:用dp[i][j]表示有i只白老鼠和j只黑老鼠的情况,该情况能转移到四种情况:
1、公主抓到白老鼠,赢,即dp[i][j]=i/(i+j)。
2、公主抓到黑老鼠,龙抓到黑老鼠,跑掉白老鼠,即dp[i][j]=dp[i-1][j-2]*j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)。
3、同2,但跑掉的是黑老鼠,即dp[i][j]=dp[i][j-3]*j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2)。
4、龙抓到白老鼠,输,不能转移。
边界条件为dp[i][0]=1,dp[0][i]=0。转移即可。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef double db;
int read()
{
char c;int sum=0,f=1;c=getchar();
while(c<'0' || c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0' && c<='9'){sum=sum*10+c-'0';c=getchar();}
return sum*f;
}
int w,b;
db dp[1005][1005];
int main()
{
w=read();b=read();
for(int i=1;i<=b;i++)
dp[0][i]=0;
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]=(db)(i+0.0)/(i+j);
if(j>=2) dp[i][j]+=dp[i-1][j-2]*(j+0.0)/(i+j)*(j-1+0.0)/(i+j-1)*(i+0.0)/(i+j-2);
if(j>=3) dp[i][j]+=dp[i][j-3]*(j+0.0)/(i+j)*(j-1+0.0)/(i+j-1)*(j-2+0.0)/(i+j-2);
}
printf("%.9lf\n",dp[w][b]);
return 0;
}