首页 > 代码库 > codeforces 148D 概率DP
codeforces 148D 概率DP
- 题意:
- 原来袋子里有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\n",dp[w][b]); } return 0; }
题意的汉语翻译来自:http://blog.csdn.net/xingyeyongheng/article/details/25545219
codeforces 148D 概率DP
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。