CF 148d Bag of mice 概率DP 好题

          D. Bag of mice
 
 
 

The dragon and the princess are arguing about what to do on the New Year's Eve. The dragon suggests flying to the mountains to watch fairies dancing in the moonlight, while the princess thinks they should just go to bed early. They are desperate to come to an amicable agreement, so they decide to leave this up to chance.

They take turns drawing a mouse from a bag which initially contains w white and b black mice. The person who is the first to draw a white mouse wins. After each mouse drawn by the dragon the rest of mice in the bag panic, and one of them jumps out of the bag itself (the princess draws her mice carefully and doesn't scare other mice). Princess draws first. What is the probability of the princess winning?

If there are no more mice in the bag and nobody has drawn a white mouse, the dragon wins. Mice which jump out of the bag themselves are not considered to be drawn (do not define the winner). Once a mouse has left the bag, it never returns to it. Every mouse is drawn from the bag with the same probability as every other one, and every mouse jumps out of the bag with the same probability as every other one.

Input

The only line of input data contains two integers w and b (0 ≤ w, b ≤ 1000).

Output

Output the probability of the princess winning. The answer is considered to be correct if its absolute or relative error does not exceed 10 - 9.

Sample test(s)
input
1 3
output
0.500000000
input
5 5
output
0.658730159
Note

Let's go through the first sample. The probability of the princess drawing a white mouse on her first turn and winning right away is 1/4. The probability of the dragon drawing a black mouse and not winning on his first turn is 3/4 * 2/3 = 1/2. After this there are two mice left in the bag — one black and one white; one of them jumps out, and the other is drawn by the princess on her second turn. If the princess' mouse is white, she wins (probability is 1/2 * 1/2 = 1/4), otherwise nobody gets the white mouse, so according to the rule the dragon wins.

 

 

 

 

题意:

国王和公主在做一个游戏,

有一个袋子,刚开始的时候里面装有w只白色的老鼠,b只黑色的老鼠。

现在2个人轮流从袋子里面抓老鼠,规则:

1.公主先手

2.先抓到白色老鼠的赢

3.公主抓的时候比较温柔,而国王比较暴力,所以每次国王抓后,都会有一只老鼠受到惊吓而逃出来

4.出来的老鼠不会再回去

5.若直到最后,2个人都没有抓到白老鼠,算国王赢

6.由于看不见袋子,每只老鼠被抓的概率相同

 

思路:

状态(i,j)表示袋子里面有i只白老鼠,j只黑老鼠的状态

dp[i][j]表示公主可以面对(i,j)这个局面的概率

由于公主 先手,则公主一定会面对(w,b)这个局面,初始化:dp[w][b]=1.0,其余为0.0

(也说明了公主不可能面对(w,b-1),(w-1,b)这些局面)

对于一个局面(i,j),不等于(w,b),公主可以面对这个局面的条件:

1.在局面(w+1,b+2)时,公主抓到的是b,然后轮到国王时,国王抓到的是b,吓跑的是w

2.在局面(w,b+3)时,公主抓到的是b,然后轮到国王时,国王抓到的是b,吓跑的也是b

则可以得到状态转移方程了

 

然后,对于公主面对的每一个局面的概率是dp[i][j],在这个局面赢的概率是i/(i+j)

累加所有局面公主赢的概率,即为答案。

 

 

 1 #include<cstdio>
 2 #include<cstring>
 3 
 4 const int maxn=1010;
 5 
 6 double dp[maxn][maxn];
 7 
 8 int main()
 9 {
10     int w,b;
11     scanf("%d%d",&w,&b);
12     memset(dp,0,sizeof dp);
13 
14     dp[w][b]=1.0;
15     for(int i=w;i>=0;i--)
16     {
17         for(int j=b;j>=0;j--)
18         {
19             if(i==w&&j==b)
20                 continue;
21             dp[i][j]=dp[i+1][j+2]*(j+2)/(i+j+3)*(j+1)/(i+j+2)*(i+1)/(i+j+1)
22             +dp[i][j+3]*(j+3)/(i+j+3)*(j+2)/(i+j+2)*(j+1)/(i+j+1);
23         }
24     }
25     double ans=0.0;
26     for(int i=0;i<=w;i++)
27     {
28         for(int j=0;j<=b;j++)
29         {
30             if(i==0&&j==0)
31                 continue;
32             ans+=dp[i][j]*i/(i+j);
33         }
34     }
35     printf("%.9f\n",ans);
36 
37     return 0;
38 }
View Code

 

 

 

 

 

 

 

 

 

posted on 2015-07-27 23:04  _fukua  阅读(205)  评论(0编辑  收藏  举报