标签:int har double using ORC lock inline http dig
袋子里有 \(w\) 只白鼠和 \(b\) 只黑鼠 ,\(A\) 和 \(B\) 轮流从袋子里抓,谁先抓到白色谁就赢。\(A\) 每次随机抓一只,\(B\) 每次随机抓完一只之后会有另一只随机老鼠跑出来。如果两个人都没有抓到白色则 \(B\) 赢。\(A\) 先抓,问 \(A\) 赢的概率。
不会概率 DP 。。。。。使用记忆化搜索。
我们记 \(f[i][j]\) 为当前还剩 \(i\) 个白鼠 \(j\) 个黑鼠 \(A\) 赢的概率。
\(dfs(n, m)\) , \(n\) 为当前白鼠个数, \(m\) 为当前黑鼠个数,如果 \(n=0\) ,那么显然 \(A\) 必输,否则如果 \(m=0\) ,那么 \(A\) 必赢。然后我们分情况讨论。先计算 \(A\) 抽到白鼠的概率为 \(\frac{n}{n+m}\) ,然后考虑 \(A\) 抽到黑鼠的情况。首先, \(A\) 抽到黑鼠的概率为 \(\frac{m}{n+m}\) ,如果 \(B\) 抽到白鼠,那么 \(A\) 赢的概率为 \(0\) ,而我们只需要计算 \(A\) 赢的概率,所以可以不用考虑 \(B\) 抽到白鼠。 \(B\) 抽到黑鼠的概率为 \(\frac{m-1}{n+m-1}\) ,然后我们接着考虑跑掉的老鼠,它是黑鼠的概率为 \(\frac{m-2}{n+m-2}\) ,是白鼠的概率为 \(\frac{n}{n+m-2}\) ,再分别乘上 \(dfs(n, m-3)\) 和 \(dfs(n-1, m-2)\) ,注意到如果当前只有两只黑鼠,那么跑掉的老鼠只能是白鼠,我们判断一波就好了。
#include <bits/stdc++.h>
#define N 1003
using namespace std;
int gi() {
int x = 0, f = 1; char c = getchar();
for ( ; !isdigit(c); c = getchar()) if (c == '-') f = -1;
for ( ; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
return x * f;
}
double f[N][N];
double dfs(int n, int m) {
if (!n) return 0.0;
if (!m) return 1.0;
if (f[n][m]) return f[n][m];
double ans = 1.0 * n / (n + m);
if (m == 2) ans += 1.0 * m / (n + m) * 1.0 * (m - 1) / (n + m - 1) * dfs(n - 1, m - 2);
else if (m > 2) {
double tmp = 1.0 * n / (n + m - 2) * dfs(n - 1, m - 2) + 1.0 * (m - 2) / (n + m - 2) * dfs(n, m - 3);
ans += 1.0 * m / (n + m) * (m - 1) / (n + m - 1) * tmp;
}
return f[n][m] = ans;
}
int main() {
int n = gi(), m = gi();
printf("%.9f", dfs(n, m));
return 0;
}
标签:int har double using ORC lock inline http dig
原文地址:https://www.cnblogs.com/hlw1/p/12273954.html