其他分享
首页 > 其他分享> > CF148D Bag of mice

CF148D Bag of mice

作者:互联网

Link

Desprition

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

\(w,b\leq 1000\)

solution

概率 dp。

数据范围显然要求我们有个 \(O(n^2)\) 的做法。

设 \(f[i][j]\) 表示袋子里有 \(i\) 只白鼠 \(j\) 只黑鼠时 ,A赢得概率。

初始化:

转移:

在转移到时候要注意一下边界问题,数组不能出现负下标,然后这道题就做完了 QAQ。

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m;
double f[1010][1010];
inline int read()
{
	int s = 0,w = 1; char ch = getchar();
	while(ch < '0' || ch > '9'){if(ch == '-') w = -1; ch = getchar();}
	while(ch >= '0' && ch <= '9'){s = s * 10 + ch - '0'; ch = getchar();}
	return s * w;
}
int main()
{
	n = read(); m = read();
	for(int i = 1; i <= n; i++)
	{
		f[i][0] = 1.0;
		f[i][1] = 1.0 * i / (i+1);
	}
	for(int i = 1; i <= n; i++)
	{
		for(int j = 2; j <= m; j++)
		{
			f[i][j] = 1.0 * i / (i+j);
			if(j >= 3) f[i][j] += 1.0 * j / (i+j) * (j-1) / (i+j-1) * (j-2) / (i+j-2) * f[i][j-3];
			if(j >= 2) f[i][j] += 1.0 * j / (i+j) * (j-1) / (i+j-1) * i / (i+j-2) * f[i-1][j-2];
		}
	}
	printf("%.9lf",f[n][m]);
	return 0;
}

标签:ch,黑鼠,CF148D,times,Bag,概率,白鼠,mice,over
来源: https://www.cnblogs.com/genshy/p/13871873.html