标签:
题目链接: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;
}
标签:
原文地址:http://blog.csdn.net/code_or_code/article/details/45424869