码迷,mamicode.com
首页 > 其他好文 > 详细

「Codeforces 148D」Bag of mice

时间:2020-02-07 19:00:16      阅读:76      评论:0      收藏:0      [点我收藏+]

标签:int   har   double   using   ORC   lock   inline   http   dig   

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

Luogu

分析

不会概率 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;
}

「Codeforces 148D」Bag of mice

标签:int   har   double   using   ORC   lock   inline   http   dig   

原文地址:https://www.cnblogs.com/hlw1/p/12273954.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!