D. Bag of mice -- (概率Dp)codeforces 148
原题链接: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';
}
分类:
codeforces
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】