抓老鼠 codeForce 148D

设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)

贴代码:

 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
",dp[w][b]);
21     return 0;
22 }
View Code
原文地址:https://www.cnblogs.com/allh123/p/3264981.html