CodeForces 148D Bag of mice

题目链接:CodeForces 148D Bag of mice

题目大意:

题解:
(dp[i][j])表示轮到王妃抓时有(i)只白鼠,(j)只黑鼠的情况下,王妃获胜的概率。
王妃获胜的情况可以分为以下三种:

  1. 王妃抓到一只白鼠,则王妃赢了,概率为(frac{i}{i+j})
  2. 王妃抓到一只黑鼠,龙抓到一只黑鼠,跑出来一只黑鼠,则转移到(dp[i][j-3]),概率为(frac{j}{i+j} imes frac{j-1}{i+j-1} imes frac{j-2}{i+j-2})
  3. 王妃抓到一只黑鼠,龙抓到一只黑鼠,跑出来一只白鼠,则转移到(dp[i-1][j-2]),概率为(frac{j}{i+j} imes frac{j-1}{i+j-1} imes frac{i}{i+j-2})
    状态转移方程为:

[dp[i][j] = frac{i}{i+j} + frac{j}{i+j} imes frac{j-1}{i+j-1} imes (frac{j-2}{i+j-2} imes dp[i][j-3] + frac{i}{i+j-2} imes dp[i-1][j-2]) ]

#include <iomanip>
#include <iostream>
using namespace std;

double dp[1010][1010];
int n, m;

int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; ++i) {
        dp[i][0] = 1;
    }
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            dp[i][j] = (double)i / (i + j);
            if (j >= 3) {
                dp[i][j] += 1.0 * j / (i + j) * ((j - 1.0) / (i + j - 1.0)) * ((j - 2.0) / (i + j - 2.0)) * dp[i][j - 3];
            }
            if (j >= 2) {
                dp[i][j] += 1.0 * j / (i + j) * ((j - 1.0) / (i + j - 1.0)) * (i / (i + j - 2.0)) * dp[i - 1][j - 2];
            }
        }
    }
    cout << fixed << setprecision(9) << dp[n][m];
    return 0;
}
原文地址:https://www.cnblogs.com/IzumiSagiri/p/15062965.html