题意:袋子里有w只白鼠和b只黑鼠。龙和公主轮流从袋子里抓老鼠。谁先抓到白色老师谁就赢。公主每次抓一只老鼠,龙每次抓完一只老鼠之后会有一只老鼠跑出来。每次抓老鼠和跑出来的老鼠都是随机的。如果两个人都没有抓到白色老鼠则龙赢。公主先抓。问公主赢的概率。
dp[i][j]表示有i只白鼠和j只黑鼠公主赢的概率。(可以由三种情况组成)
1.公主抓了白鼠。dp[i][j]=i/i+j;
公主抓了黑鼠,龙也抓了黑鼠 (j>=2):
2.跳出去的是白鼠 dp[i][j]+=j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)*dp[i-1][j-2];
3.当j>3时,跳出去的是黑鼠 dp[i][j]+=j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2)*dp[i][j-3];
注意处理好边界情况.
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; double dp[1005][1005]; int main() { int w,b; while(scanf("%d%d",&w,&b)!=EOF) { memset(dp,0,sizeof(dp)); for(int i=0;i<=b;i++) dp[0][i]=0.0; for(int i=0;i<=w;i++) dp[i][0]=1.0; dp[0][0]=0; for(int i=1;i<=w;i++) for(int j=1;j<=b;j++) { dp[i][j]+=(double)i/(i+j); if(j>=2) dp[i][j]+=(double)j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)*dp[i-1][j-2]; if(j>=3) dp[i][j]+=(double)j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2)*dp[i][j-3]; } } printf("%.9f ",dp[w][b]); return 0; }