题意:有 W 只白老鼠和 B 只黑老鼠 , 公主先手,龙后手,每次抓取一只老鼠,若为白则胜利,不过龙每次抓取一只老鼠以后都会有一只老鼠偷偷跑掉,求公主获胜的概率
分析:设 dp[ w ][ b ] 表示还剩下 w 只白老鼠 和 b 只黑老鼠的情况下公主的胜率,
则当前情况下公主还能胜利的可能有三种
① w / (w+b) //直接抓到白老鼠
② dp[ w-1 ][ b-2 ] * *
*
//公主抓到黑老鼠,龙抓到黑老鼠,然后跑掉一只白老鼠 ;
③ dp[ w ][ b-3 ] * *
*
//公主抓到黑老鼠,龙抓到黑老鼠,然后跑掉一只黑老鼠 ;
明显我们最终所求为 dp[ W ][ B ] ,顺推即可;
代码:
#include<cstdio>
#include<iostream>
using namespace std;
const int N = 1005;
double dp[N][N];
int W,B;
int main()
{
cin>>W>>B;
dp[0][0]=0.0;
for(int i=0;i<=B;i++) dp[0][i]=0.0;
for(int i=1;i<=W;i++) dp[i][0]=1.0; //注意初始化
for(int w=1;w<=W;w++)
for(int b=1;b<=B;b++)
{
dp[w][b]=1.0*w/(w+b);
if(b>=2)
dp[w][b]+=dp[w-1][b-2]*(1.0*w/(w+b))*(1.0*b/(w+b-1))*(1.0*(b-1)/(w+b-2));
if(b>=3)
dp[w][b]+=dp[w][b-3]*(1.0*b/(w+b))*(1.0*(b-1)/(w+b-1))*(1.0*(b-2)/(w+b-2));
}
printf("%.9f\n",dp[W][B]);
return 0;
}