标签:
题目链接: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