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

BZOJ P1419 Red is good


题目传送门


思路

状态设计

我们可以想象先把所有牌倒入一个袋子中,然后在一个一个取。
d p i , j dp_{i, j} dpi,j 表示目前袋中有【 i i i 个红牌】和【 j j j 个黑牌】。

状态转移

现在考虑从袋子中抓牌:

  1. 抓到的是红牌:
    抓到红牌的概率是 i i + j \frac{i}{i + j} i+ji,抓后袋子中还剩下 i − 1 i - 1 i1 个红牌和 j j j 个黑牌,那么抓到红牌的期望贡献就是 i i + j × ( d p i − 1 , j + 1 ) \frac{i}{i + j} \times (dp_{i - 1, j} + 1) i+ji×(dpi1,j+1)
  2. 抓到的是黑牌:
    抓到黑牌的概率是 j i + j \frac{j}{i + j} i+jj,抓后袋子中还剩下 i i i 个红牌和 j − 1 j - 1 j1 个黑牌,那么抓到红牌的期望贡献就是 j i + j × ( d p i , j − 1 + 1 ) \frac{j}{i + j} \times (dp_{i, j - 1} + 1) i+jj×(dpi,j1+1)
  3. 随时停止:因为有可以随时停止这一限制,所以在转移时,我们要将 d p i , j − 1 dp_{i, j - 1} dpi,j1 d p i − 1 , j dp_{i - 1, j} dpi1,j 0 0 0 m a x max max。因为再在剩下的牌中取时,期望已经是负数,所以取的话肯定更劣。与 0 0 0 m a x max max 就相当于是停止取牌。

因此总得转移方程就是:
d p i , j = i i + j × ( m a x ( d p i − 1 , j , 0 ) + 1 ) + j i + j × ( m a x ( d p i , j − 1 , 0 ) + 1 ) dp_{i, j} = \frac{i}{i + j} \times (max(dp_{i - 1, j}, 0) + 1) + \frac{j}{i + j} \times (max(dp_{i, j - 1}, 0) + 1) dpi,j=i+ji×(max(dpi1,j,0)+1)+i+jj×(max(dpi,j1,0)+1)

边界条件

当没有黑牌的时候, ∀ i ∈ [ 1 , n ] , d p i , 0 = i \forall i \in [1, n], \ dp_{i, 0} = i i[1,n], dpi,0=i

复杂度

  • 时间复杂度 O ( n × m ) O(n \times m) O(n×m)
  • 空间由于限制了 64 M B 64MB 64MB,所以要用滚动数组,最后为 O ( m ) O(m) O(m)

代码

#include <bits/stdc++.h>using namespace std;const int maxn = 5e3 + 7;int n, m;
double dp[2][maxn];
int main() {scanf("%d%d", &n, &m);	for (int i = 1; i <= n; ++i) {int now = i & 1, lst = (i - 1) & 1;dp[now][0] = i;for (int j = 1; j <= m; ++j) {dp[now][j] = (max(dp[lst][j], 0.0) + 1) * i / (i + j) + (max(dp[now][j - 1], 0.0) - 1) * j / (i + j);}}int x = dp[n & 1][m] * 1e6;  // 不进位保留 6 位 小数printf("%.6lf\n", max(0.0, x * 1e-6));return 0;
} 

相关文章:

  • 【leetcode100】分割等和子集
  • Linux 进程信号详解
  • ping: socket: Operation not permitted
  • AI调试工具有哪些?
  • 【漫话机器学习系列】211.驻点(Stationary Points)
  • CANFD技术在新能源汽车通信网络中的应用与可靠性分析
  • 论文阅读:2025 arxiv AI Alignment: A Comprehensive Survey
  • 深入理解 Java 多线程:锁策略与线程安全
  • 使用 Vite 快速搭建现代化 React 开发环境
  • 小程序 GET 接口两种传值方式
  • C#测试linq中的左连接的基本用法
  • 嵌入式程序更换为IAP网络固件升级教程
  • 保生产 促安全 迎国庆
  • Android studio开发——room功能实现用户之间消息的发送
  • 【实战】在 Linux 上使用 Nginx 部署 Python Flask 应用
  • 实现Azure Databricks安全地请求企业内部API返回数据
  • 【MySQL】004.MySQL数据类型
  • 【Openlayers】Openlayers 入门教程
  • ARINC818-实现
  • 解决 IntelliJ IDEA 项目启动时端口冲突问题
  • 今年1-3月全国吸收外资2692.3亿元人民币
  • 美方将对中国制造船只征收“港口费”,外交部:损人害己
  • 科技如何赋能社会治理?帮外卖员找新家、无人机处理交通事故……
  • 生于1984年,郭宝任湖北黄石市副市长
  • 西北政法大学推无手机课堂,有学生称要求全交,学校:并非强制
  • 东莞一初中生跑操时倒地身亡,家属质疑校方施救不力