D. Bag of mice -- (概率Dp)codeforces 148

发布时间 2023-07-11 16:48:51作者: N再再

原题链接:https://codeforces.com/contest/148/submission/213227373

题意:捉老鼠游戏,谁捉到白鼠就是胜利,我们求公主获胜的概率,当龙抓鼠时会先放跑一只,在吓跑一只,任意鼠跑走的概率相同。

思路:因为我们只求公主获胜的概率,所以只有以下几种情况:

设 i 为当前白鼠数量, j 为当前黑鼠数量

1. 公主直接抓到了白鼠,概率为 i / (i + j)

2. 公主抓到了黑鼠, 龙抓到了一只黑鼠, 放跑了一只黑鼠。 概率为

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

3. 公主抓到了黑鼠, 龙抓到了一只黑鼠, 放跑了一只白鼠。 概率为

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

初始化 : 当黑鼠为 0 时, 捉白鼠的概率为 1;反之当白鼠为 0 时, 获胜的概率为 0;

AC代码:

const int N = 1010;
int w, b;
double dp[N][N];

void solve()
{
	cin >> w >> b;
	
	for (int i = 1; i <= w; i ++) dp[i][0] = 1;
	for (int i = 1; i <= b; i ++) dp[0][i] = 0;
	
	for (int i = 1; i <= w; i ++)
	{
		for (int j = 1; j <= b; j ++)
		{
			dp[i][j] += i * 1.0 / (i + j);
			if (j >= 3)
			{
				dp[i][j] += dp[i][j - 3] * j / (i + j) * (j - 1) / (i + j - 1) * (j - 2) / (i + j - 2);
			}
			if (j >= 2)
			{
				dp[i][j] += dp[i - 1][j - 2] * j / (i + j) * (j - 1) / (i + j - 1) * i / (i + j - 2);
			}
		}
	}
	cout << dp[w][b] << '\n';
}