CF D. Bag of mice(概率dp)

来源:互联网 发布:java监控系统日志抓取 编辑:程序博客网 时间:2024/05/20 05:29

http://codeforces.com/problemset/problem/148/D


这里有w只白鼠和b只黑鼠,龙和王妃轮流从袋子里抓鼠,每次抓一只,抓到第一只白鼠的人获胜。当龙抓一只鼠时,袋子里会跑掉一只鼠,跑掉的鼠是等概率的。问王妃获胜的概率。


设有i只白鼠j只黑鼠的状态下王妃获胜的概率是dp[i][j],这种状态可由一下三种状态得到:

王妃第一次就取得一只白鼠获胜,概率为i/(i+j);

王妃没有取到白鼠,取黑鼠的概率是j/(i+j),若王妃要赢,下次龙一定取黑鼠,概率为(j-1)/(i+j-1),同时跑掉的是黑鼠,概率为(j-2)/(i+j-2),状态转移到dp[i][j-3];

王妃没有取到白鼠,取黑鼠的概率是j/(i+j),若王妃要赢,下次龙一定取黑鼠,概率为(j-1)/(i+j-1),同时跑掉的是白鼠,概率为i/(i+j-2),状态转移到dp[i-1][j-2];


综上,dp[i][j] = i/(i+j) + j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2)*dp[i][j-3] + j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)*dp[i-1][j-2]。


#include <stdio.h>#include <iostream>#include <map>#include <set>#include <list>#include <stack>#include <vector>#include <math.h>#include <string.h>#include <queue>#include <string>#include <stdlib.h>#include <algorithm>//#define LL __int64#define LL long long#define eps 1e-12#define PI acos(-1.0)using namespace std;const int INF = 0x3f3f3f3f;const int maxn = 4010;double dp[1010][1010];int main(){int w,b;while(~scanf("%d %d",&w,&b)){for(int i = 1; i <= w; i++)dp[i][0] = 1;for(int i = 0; i <= b; i++)dp[0][i] = 0;for(int i = 1; i <= w; i++){for(int j = 1; j <= b; j++){dp[i][j] = i*1.0/(i+j);if(j >= 2)dp[i][j] += j*1.0/(i+j) * (j-1)*1.0/(i+j-1) * (i*1.0)/(i+j-2) * dp[i-1][j-2];if(j >= 3)dp[i][j] += j*1.0/(i+j) * (j-1)*1.0/(i+j-1) * (j-2)*1.0/(i+j-2) * dp[i][j-3];}}printf("%.9lf\n",dp[w][b]);}return 0;}


0 0
原创粉丝点击