码迷,mamicode.com
首页 > 其他好文 > 详细

CF 148D. Bag of mice[概率dp]

时间:2015-05-02 09:38:39      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:http://codeforces.com/problemset/problem/148/D

题目大意:一袋子里有w个白老鼠,b个黑老鼠;A和B轮流抓老鼠(不放回),谁先抓到白老鼠,谁win;因为B粗鲁,每次抓完一只老鼠,会跑出来一只;A first;

            求A win的概率;

题目分析:

此类概率dp的状态比较固定,dp(i , j )表示当前状态Awin的概率;

      1:  dp[i][0],A win的概率为 1;dp[0][j] 概率为 0;

      2:  dp[i][j]     如下四种转移:

                                     如果A取白,概率为 i/(i+j),

                                     如果A取黑,B取白,概率 0,

                                     如果A取黑,B取黑,跑出黑 概率 1.0*j/(i+j)*(j-1.0)/(i+j-1.0)*(j-2.0)/(i+j-2)*dp[i][j-3];  //前提 :黑>=3

                                     如果A取黑,B取黑,跑出白 概率 1.0*j/(i+j)*(j-1.0)/(i+j-1.0)*i/(i+j-2)*dp[i-1][j-2];  //前提:白>=1;黑>=2

代码:

//author:ACsorry
//result:Yes
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
#include<deque>
#include<stack>
#include<map>
#include<set>
#define INF 1<<29
#define maxInt 0x7fffffff
#define SUP 0x80000000
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;

typedef long long LL;
const int N=1007;

double dp[N][N];

int main()
{
    int w,b;
    while(cin>>w>>b)
    {
        dp[0][0]=0;
        for(int i=1;i<=w;i++) dp[i][0]=1.0;//只有白鼠
        for(int i=1;i<=b;i++) dp[0][i]=0.0;//只有黑鼠

        for(int i=1;i<=w;i++){
            for(int j=1;j<=b;j++){
                dp[i][j]=1.0*i/(i+j);
                if(j>=3)
                    dp[i][j]+=1.0*j/(i+j)*(j-1.0)/(i+j-1.0)*(j-2.0)/(i+j-2)*dp[i][j-3];
                if(j>=2)
                    dp[i][j]+=1.0*j/(i+j)*(j-1.0)/(i+j-1.0)*i/(i+j-2)*dp[i-1][j-2];
            }
        }
        printf("%.9f\n",dp[w][b]);

    }
    return 0;
}



CF 148D. Bag of mice[概率dp]

标签:

原文地址:http://blog.csdn.net/code_or_code/article/details/45424869

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!