CodeForces 148D Bag of mice(概率DP )



题意:原来袋子里有w只白鼠和b只黑鼠 龙和王妃轮流从袋子里抓老鼠。谁先抓到白色老鼠谁就赢。 王妃每次抓一只老鼠,龙每次抓完一只老鼠之后会有一只老鼠跑出来。 每次抓老鼠和跑出来的老鼠都是随机的。 如果两个人都没有抓到白色老鼠则龙赢。王妃先抓。 问王妃赢的概率。 

思路:用dp[i][j]表示剩下i只白鼠和j只黑鼠时公主赢的概率,那么我们可以得到状态转移方程

首先,如果在这种状态下公主直接抓到白鼠那么她胜的概率是i/(i+j)

其次,如果她这次抓的是黑鼠,那么如果想要公主胜,那么龙也必须抓的是黑鼠

这时又分成了两种情况,黑鼠逃脱和白鼠逃脱,转移分别为

dp[i][j] += j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)*dp[i-1][j-2]; 
dp[i][j] += j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2)*dp[i][j-3]

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<map>
#include<set>
#include<ctime>
#define eps 1e-6
#define LL long long
#define pii pair<int, int>
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
double dp[1100][1100];
int main() {
    //freopen("input.txt", "r", stdin);
	int w, b; 
	while(scanf("%d%d", &w, &b) == 2) {
		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] = (double)i/(i+j);
				if(j>=2) dp[i][j] += (double)j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)*dp[i-1][j-2]; 
				if(j>=3) dp[i][j] += (double)j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2)*dp[i][j-3];
			}
		}
		printf("%.10lf\n", dp[w][b]);
	}
    return 0;
}

















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值