- 题意:
- 原来袋子里有w仅仅白鼠和b仅仅黑鼠
-
龙和王妃轮流从袋子里抓老鼠。
谁先抓到白色老师谁就赢。
- 王妃每次抓一仅仅老鼠,龙每次抓完一仅仅老鼠之后会有一仅仅老鼠跑出来。
- 每次抓老鼠和跑出来的老鼠都是随机的。
- 假设两个人都没有抓到白色老鼠则龙赢。王妃先抓。
- 问王妃赢的概率。
第一次写的时候还是出问题了,还是对概率DP理解有问题:
当前状态满足条件的概率=segma(转移到状态si的概率pi * 状态i满足条件的概率)
当前状态满足条件的概率=segma(转移到状态si的概率pi * 状态i满足条件的概率)
但是一定要枚举出来全部可能转移的状态,并且仅仅考虑一步。就是说考虑一个游戏回合之后的状态就可以,不考虑2个回合,3个回合......
#include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <iostream> #include <iomanip> #include <cmath> #include <map> #include <set> #include <queue> using namespace std; #define ls(rt) rt*2 #define rs(rt) rt*2+1 #define ll long long #define ull unsigned long long #define rep(i,s,e) for(int i=s;i<e;i++) #define repe(i,s,e) for(int i=s;i<=e;i++) #define CL(a,b) memset(a,b,sizeof(a)) #define IN(s) freopen(s,"r",stdin) #define OUT(s) freopen(s,"w",stdout) const ll ll_INF = ((ull)(-1))>>1; const double EPS = 1e-8; const int INF = 100000000; const int MAXN = 1000+100; double dp[MAXN][MAXN]; int main() { int w,b; while(~scanf("%d%d",&w,&b)) { CL(dp,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*(j-1)*(j-2)/(1.0*(i+j)*(i+j-1)*(i+j-2))*dp[i][j-3]; if(i>=1 && j>=2)dp[i][j]+=1.0*i*j*(j-1)/(1.0*(i+j)*(i+j-1)*(i+j-2))*dp[i-1][j-2]; } printf("%.9lf ",dp[w][b]); } return 0; }
题意的汉语翻译来自:http://blog.csdn.net/xingyeyongheng/article/details/25545219