CodeForces 148D : Bag of mice概率DP

传送门

题意

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

分析

这道题我们可以去顺推,一开始有 n n n只小白鼠和 m m m只小黑鼠,那么我们就有两种决策,选小白鼠的话,结束游戏,最后答案+ n / ( m + n ) n / (m + n) n/(m+n),选小黑鼠,又产生两种决策,最后结束的条件是, n = 0 n = 0 n=0,B赢, m = 0 m = 0 m=0,A赢,跑一下记忆化搜索即可

代码

#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define dl(x) printf("%lld\n",x);
#define di(x) printf("%d\n",x);
#define _CRT_SECURE_NO_WARNINGS
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
typedef vector<int> VI;
const int INF = 0x3f3f3f3f;
const int N = 1010;
const ll mod = 1000000007;
const double eps = 1e-9;
const double PI = acos(-1);
template<typename T>inline void read(T &a) {
	char c = getchar(); T x = 0, f = 1; while (!isdigit(c)) {if (c == '-')f = -1; c = getchar();}
	while (isdigit(c)) {x = (x << 1) + (x << 3) + c - '0'; c = getchar();} a = f * x;
}
int gcd(int a, int b) {return (b > 0) ? gcd(b, a % b) : a;}

double f[N][N];

double res(int x,int y){  //白兔子,黑兔子
	if(!x) return 0;
	if(!y) return 1.0;
	if(f[x][y]) return f[x][y];
	double ans = 1.0 * x / (x + y);
	if(y == 2) ans += 1.0 * y /(x + y) * (y - 1) / (x + y - 1);
	else if(y >= 3)ans += 1.0 * y / (x + y) * (y - 1) / (x + y - 1) * (1.0 * (x) / (x + y - 2) * res(x - 1,y - 2) + 1.0 *(y - 2) / (x + y - 2) * res(x,y - 3));
	f[x][y] = ans;
	return ans;
}

int main() {
	int n,m;
	read(n),read(m);
	printf("%.9lf\n",res(n,m));
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值