题目链接:CodeForces 148D Bag of mice
题目大意:
题解:
设(dp[i][j])表示轮到王妃抓时有(i)只白鼠,(j)只黑鼠的情况下,王妃获胜的概率。
王妃获胜的情况可以分为以下三种:
- 王妃抓到一只白鼠,则王妃赢了,概率为(frac{i}{i+j});
- 王妃抓到一只黑鼠,龙抓到一只黑鼠,跑出来一只黑鼠,则转移到(dp[i][j-3]),概率为(frac{j}{i+j} imes frac{j-1}{i+j-1} imes frac{j-2}{i+j-2});
- 王妃抓到一只黑鼠,龙抓到一只黑鼠,跑出来一只白鼠,则转移到(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;
}