CF148D Bag of mice

元气小坏坏 提交于 2020-02-16 14:32:52
题意:
有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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!