当前位置: 首页 > news >正文

CF148D Bag of mice


题目传送门


思路

状态设计

d p i , j dp_{i, j} dpi,j 表示袋中有 i i i 个白鼠和 j j j 个黑鼠时, A A A 能赢的概率。

状态转移

现在考虑抓鼠情况:

  1. A A A 抓到白鼠:直接判 A A A 赢,概率是 i i + j \frac{i}{i + j} i+ji
  2. A , B A,B A,B 都抓到一只黑鼠,并且跑出来一只黑鼠:概率为 j i + j × j − 1 i + j − 1 × j − 2 i + j − 2 \frac{j}{i + j} \times \frac{j - 1}{i + j - 1} \times \frac{j - 2}{i + j - 2} i+jj×i+j1j1×i+j2j2,然后转移到 d p i , j − 3 dp_{i, j - 3} dpi,j3,故此情况下 A A A 获胜的概率为 j i + j × j − 1 i + j − 1 × j − 2 i + j − 2 × d p i , j − 3 \frac{j}{i + j} \times \frac{j - 1}{i + j - 1} \times \frac{j - 2}{i + j - 2} \times dp_{i, j - 3} i+jj×i+j1j1×i+j2j2×dpi,j3
  3. A , B A,B A,B 都抓到一只黑鼠,并且跑出来一只白鼠:概率为 j i + j × j − 1 i + j − 1 × i i + j − 2 \frac{j}{i + j} \times \frac{j - 1}{i + j - 1} \times \frac{i}{i + j - 2} i+jj×i+j1j1×i+j2i,然后转移到 d p i − 1 , j − 2 dp_{i - 1, j - 2} dpi1,j2,故此情况下 A A A 获胜的概率为 j i + j × j − 1 i + j − 1 × i i + j − 2 × d p i − 1 , j − 2 \frac{j}{i + j} \times \frac{j - 1}{i + j - 1} \times \frac{i}{i + j - 2} \times dp_{i - 1, j - 2} i+jj×i+j1j1×i+j2i×dpi1,j2
  4. B B B 抓到白鼠:此情况 A A A 失败,故不考虑。

所以总得转移方程就是:
d p i , j = i i + j + j i + j × j − 1 i + j − 1 × j − 2 i + j − 2 × d p i , j − 3 + j i + j × j − 1 i + j − 1 × i i + j − 2 × d p i − 1 , j − 2 dp_{i, j} = \frac{i}{i + j} + \frac{j}{i + j} \times \frac{j - 1}{i + j - 1} \times \frac{j - 2}{i + j - 2} \times dp_{i, j - 3} + \frac{j}{i + j} \times \frac{j - 1}{i + j - 1} \times \frac{i}{i + j - 2} \times dp_{i - 1, j - 2} dpi,j=i+ji+i+jj×i+j1j1×i+j2j2×dpi,j3+i+jj×i+j1j1×i+j2i×dpi1,j2
当然转移的时候得分别判断【 j j j 是否大于等于 3 3 3】和【 i i i 是否大于等于 1 1 1 j j j 是否大于等于 2 2 2】。

边界条件

  1. 在没有老鼠或全是黑鼠的情况下, A A A 一定输,即: ∀ i ∈ [ 0 , m ] , d p 0 , i = 0 \forall i \in [0, m], \ dp_{0, i} = 0 i[0,m], dp0,i=0
  2. 在只有白鼠的情况下, A A A 一定赢,即: ∀ i ∈ [ 1 , n ] , d p i , 0 = 1 \forall i \in [1, n], \ dp_{i, 0} = 1 i[1,n], dpi,0=1

复杂度

  • 时间复杂度: O ( n × m ) O(n \times m) O(n×m)
  • 空间复杂度: O ( n × m ) O(n \times m) O(n×m)

代码

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e3 + 7;int n, m;
double dp[maxn][maxn];
int main() {scanf("%d%d", &n, &m);for (int i = 0; i <= m; ++i) dp[0][i] = 0;  // 没有老鼠或只有黑鼠, B 赢 for (int i = 1; i <= n; ++i) dp[i][0] = 1;  // 只有白鼠, A 赢for (int i = 1; i <= n; ++i) {for (int j = 1; j <= m; ++j) {dp[i][j] += 1.0 * i / (i + j);if (j >= 3) {dp[i][j] += 1.0 * j / (i + j) * 1.0 * (j - 1) / (i + j - 1) *1.0 * (j - 2) / (i + j - 2) * dp[i][j - 3];}if (i >= 1 && j >= 2) {dp[i][j] += 1.0 * j / (i + j) * 1.0 * (j - 1) / (i + j - 1) * 1.0 * i / (i + j - 2) * dp[i - 1][j - 2];}}}printf("%.9lf\n", dp[n][m]);return 0;
} 

相关文章:

  • M|触碰你
  • [Android] 豆包爱学v4.5.0小学到研究生 题目Ai解析
  • 四月下旬系列
  • 在VMware Workstation 17 Pro上实现Windows与UOS虚拟机之间复制粘贴文本及文件
  • MySQL——事务
  • Linux中的软件管理
  • 【刷题Day20】TCP和UDP(浅)
  • 前端面试的话术集锦第 25 篇博文——CSS面试题上
  • 数仓面试内容
  • Windows系统安装`face_recognition`
  • 7.vtk坐标系
  • AI 提示词教程:从新手到高手的进阶之路
  • 运筹学之模拟退火
  • Python实例题:神经网络实现人脸识别任务
  • c++题目_P1443 马的遍历
  • [数学] 挑战nbc
  • WinForms开发基础:实现带X按钮的ClearableTextBox控件
  • 【数论】3260. 找出最大的 N 位 K 回文数|2370
  • 老婆是用来爱的,不是用来吼的
  • 探秘Python 工匠:案例、技巧与工程实践:解锁Python进阶的通关秘籍
  • 朱雨玲:从前世界第一到兼职运动员,30岁后开始“玩”乒乓
  • 淄博张店区国资公司挂牌转让所持“假国企”股权,转让底价为1元
  • 人民文学奖颁出,董宇辉获传播贡献奖
  • 在没有穹顶的剧院,和春天的音乐会来一场约会
  • 观察|雀巢咖啡加码中国布局,如何借势云南咖啡打造新增长极?
  • 马上评丨敦煌网美国爆火,“市场之腿”总能跨越关税壁垒