抓老鼠 codeForce 148D - Bag of mice 概率DP
设dp[i][j]为有白老鼠i只,黑老鼠j只时轮到公主取时,公主赢的概率。
那么当i = 0 时,为0
当j = 0时,为1
公主可直接取出白老鼠一只赢的概率为i/(i+j)
公主取出了黑老鼠,龙必然也要取出黑老鼠公主才能赢,跑出来的老鼠有两种可能
跑出来的是黑老鼠,公主赢的概率为dp[i][j] += j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2)*dp[i][j-3].(j>=3)
跑出来的是白老鼠,公主赢的概率为dp[i][j] += j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)*dp[i-1][j-2].(j>=2)
贴代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #define N 1005 3 double dp[N][N]; 4 int main() 5 { 6 // freopen("in.c","r",stdin); 7 int w,b; 8 scanf("%d%d",&w,&b); 9 for(int i=0; i<=w; ++i) dp[i][0] =1; 10 for(int i=0; i<=b; ++i) dp[0][i] =0; 11 for(int i=1; i<=w; ++i) 12 { 13 for(int j=1; j<=b; ++j) 14 { 15 dp[i][j] = (double)i/(i+j); 16 if(j >= 3) dp[i][j] += (double)j/(i+j)*(double)(j-1)/(i+j-1)*(double)(j-2)/(i+j-2)*dp[i][j-3]; 17 if(j >= 2) dp[i][j] += (double)j/(i+j)*(double)(j-1)/(i+j-1)*(double)i/(i+j-2)*dp[i-1][j-2]; 18 } 19 } 20 printf("%.9lf\n",dp[w][b]); 21 return 0; 22 }