codeforces--148D--Bag of mice--概率DP

D. Bag of mice
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

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 exceed10 - 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,表示white mouse和black mouse的数量,即白鼠和黑鼠的数量,每一轮两个人都可以拿一只,谁先拿到白的就赢了,每一轮两人拿完之后还会跑掉一只,即每轮会拿掉三只老鼠,问先拿的那个人赢的概率。

题解:dp[x][y]表示当前剩余x只白鼠和y只黑鼠的情况下赢的概率,所以当前赢的概率为x/(x+y),然后考虑上两人选黑鼠情况下跑掉白鼠或者黑鼠这两种情况后赢的概率;

下面这dp推论公式是这样理解的,我举个例子

状态流程:dp状态1--取完两只跑掉一只-->dp状态2--取完两只跑掉一只-->dp状态3.....       比如dp[4][4]--取完两只跑掉一只-->dp[3][2]或dp[4][1],OK?

理解方式:就像深度优先搜索里面的回溯一样。。对,就是酱紫的~

dp[状态1]=(1到2的概率)*dp[状态2]
dp[状态2]=(2到3的概率)*dp[状态3]
dp[状态3]=(3到4的概率)*dp[状态4]
dp[状态4]=(4到5的概率)*dp[状态5].........

归纳起来就是dp[状态1]=(1到2)*(2到3)*(3到4)*(4到5)*...*dp[最终不能再取的状态],不能再取状态就是没有黑鼠了的状态,所以初始化的时候应该把黑鼠为0白鼠从0到b都设置为概率1,因为没有黑鼠只有白鼠,随便取都是赢


#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <cmath>
#include <algorithm>
#define Max(a,b) (a>b?a:b)
#define Min(a,b) (a<b?a:b)
#define mod 1000000007
#define LL __int64
#define M 1010
using namespace std;
double dp[M][M];
int main()
{
    int n,m,i,j,k,l;
    while(cin>>n>>m)
    {
        memset(dp,0,sizeof(dp));
        for(i=1;i<=n;i++)dp[i][0]=1;//没有
        for(i=1;i<=n;i++)//
        for(j=1;j<=m;j++)//
        {
            dp[i][j]=1.0*i/(i+j);//当前赢的概率
            if(j>=2)dp[i][j]+=dp[i-1][j-2]*1.0*j/(i+j)*1.0*(j-1)/(i+j-1)*1.0*i/(i+j-2);//dp[下一个状态1]*这个状态转移到下个状态的概率--两人取黑跑白
            if(j>=3)dp[i][j]+=dp[i][j-3]*1.0*j/(i+j)*1.0*(j-1)/(i+j-1)*1.0*(j-2)/(i+j-2);//dp[下一个状态2]*这个状态转移到下个状态的概率--两人取黑跑黑
        }
        printf("%.9lf\n",dp[n][m]);
    }
	return 0;
}


dp[状态1]=(1到2的概率)*dp[状态2]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值