CF148D Bag of mice

题意:
有a只白老鼠,b只黑老鼠,A先抓,B后抓,只要有一个人先抓住老鼠,游戏就结束了。每次当B抓住一只老鼠且游戏还没结束时,就睡会逃出一只老鼠。问A抓住老鼠的期望值为多少。(如果都没抓住,A不算赢)
思路:
设f[a][b]为还剩a只白老鼠,b只黑老鼠时的期望,设定此时的含义是在A先抓,B后抓的条件下成立。
给出两个边界条件:
1.f[0][i]=0
2.f[i][0]=1
对于f[i][j]来说,f[i][j]=f[i-2][j-1]+f[i][j-3]+此时A直接抓到白老鼠的概率。
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int a,b;
double inf,f[N][N];

double dfs(int aa,int bb)
{
	if (f[aa][bb]!=inf) return f[aa][bb];
	if (!aa) {f[aa][bb]=0; return 0;}
	if (!bb) {f[aa][bb]=1; return 1;}
	double ans=0;
	double a=double(aa);
	double b=double(bb);
	ans+=a/(a+b);
	if (b-3>=0) ans+=b/(a+b)*(b-1)/(a+b-1)*(b-2)/(a+b-2)*dfs(a,b-3);
	if (a-1>=0 && b-2>=0) ans+=b/(a+b)*(b-1)/(a+b-1)*a/(a+b-2)*dfs(a-1,b-2);
	f[aa][bb]=ans;
	return f[aa][bb];
}

int main(){
	inf=-2e9;
	scanf("%d%d",&a,&b);
	for (register int i=0; i<=a; ++i)
	for (register int j=0; j<=b; ++j) f[i][j]=inf;
	printf("%.10f\n",dfs(a,b));
return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值