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

概率/期望 DP Let‘s Play Osu!

题目链接:Problem - B - Codeforces

题目大意:

有一个长度为 n 的序列,第 i 个位置上为 "O" 的概率为 p_{i} ,为 "X" 的概率为 1-p_{i} 。

一个序列的得分定义为:

求整个序列的期望得分。

Solution1:

注意到一个关键性质:(x + 1) ^ 2 - x^2 = 2x + 1

也就是说,我们在已经有一段长度为 x 的连续 "O" 序列的情况下,再加多一个 "O" ,得到的贡献就会加上 "2x+1" 。

于是就把平方的期望转化成了线性的

可以设一个 len[i] 表示以 i 结尾的连续 "O" 序列的期望长度,f[i] 表示序列1~ i 的期望贡献,那么:

f[i] = (1-p[i]) * f[i-1] + p[i] * (f[i-1] + 2 * len[i-1] + 1)

len[i] = p[i] * (len[i-1] + 1) + (1-p[i]) * 0 = p[i] * (len[i-1] + 1)

Code:

#include<cstdio>
#include<cstring>
using namespace std;#define N 100005int n;
double p[N],len[N],f[N];int main()
{scanf("%d",&n);for (int i = 1;i <= n;++ i) scanf("%lf",&p[i]);len[0] = f[0] = 0.00;for (int i = 1;i <= n;++ i){f[i] = (1.00 - p[i]) * f[i - 1] + p[i] * (f[i - 1] + 2.00 * len[i - 1] + 1.00);len[i] = p[i] * (len[i - 1] + 1.00);}printf("%.6lf\n",f[n]);return 0;
}

Solution2:

Solution1是最为广泛的做法,而官方解答里还有一个更为巧妙的发现。

注意到另一个关键性质:n^2 = 2C_{n}^2 + n

也就是说,对于一段长度为 n 的连续 "O" 序列,得分贡献可以拆分为两部分:

1. 每一个 "O" 贡献 1 分

2. 每一对 "OO" 贡献 2 分 (不一定要相邻)

于是我们又可以利用期望的线性性质拆分来做。

第一部分的答案很简单,就是计算整个序列期望出现多少次 "O" ,即  \sum p_{i} 。

第二部分的答案,我们要计算的就是 [i,j] 这段序列出现全 "O" 的概率,记作 P(i,j) ,其实 P(i,j) 代表的就是第 i 个为 "O" 和第 j 个为 "O" 的组合贡献,它并不包含譬如 P(i+1,j)、P(i,j + 1) ... 的贡献。那么这部分的答案就是 2\sum_{i < j} P(i,j) 。下面考虑如何快速计算 P(i,j):

(注意我们不可以用类似前缀和的想法维护前缀积,那样精度会爆掉)

可以设 f_{i} = \sum_{k < i} P(k,i),则  f_{i} = f_{i-1} * p_{i} + p_{i-1} * p_{i}

那么两部分答案加起来就是:Ans = \sum p_{i} + 2\sum_{i=2}^n f_{i}

Code:

#include<cstdio>
#include<cstring>
using namespace std;#define N 100005int n;
double p[N],f[N],ans;int main()
{scanf("%d",&n),ans = 0.00;for (int i = 1;i <= n;++ i) scanf("%lf",&p[i]),ans += p[i];f[1] = 0.00;for (int i= 2;i <= n;++ i) f[i] = f[i - 1] * p[i] + p[i - 1] * p[i],ans += 2.00 * f[i];printf("%.6lf\n",ans);return 0;
}

Solution2 看似比较难想,但它给了我们一种做题的全新思路。

http://www.dtcms.com/a/318093.html

相关文章:

  • 【数论】素数
  • Vue3入门到精通: 1.2 Vue3响应式系统深度解析
  • go与grpc
  • 网站、域名、IP在什么场景下需要备案
  • Linux之Shell脚本基本语法
  • InfluxDB 集群部署与高可用方案(二)
  • 基于vue的财务管理系统/基于php的财务管理系统
  • 02.【数据结构-C语言】顺序表(线性表概念、顺序表实现:增删查、前向声明、顺序表实现通讯录项目:增删改查、通讯录数据导入及保存到本地文件)
  • <form> + <iframe> 方式下载大文件的机制
  • Python 通过Playwright+OpenCV破解滑动验证码 实例
  • 【Python】命令行工具实现监控ctrl+c与运行时长终止任务
  • 2024学年云南省职业院校技能大赛 “信息安全管理与评估”赛项 比赛样题任务书
  • FreeRTOS临界资源保护方法
  • 商派小程序商城(小程序/官网/APP···)的范式跃迁与增长再想象
  • android NDK 报错日志解读和还原报错方法名
  • Mybatis的高级特性
  • 【自动化运维神器Ansible】playbook核心组件之tags深度解析
  • 第一性原理科学计算服务器如何选择配置-CPU选择篇
  • thinkpad E14重装win 10系统
  • 云端软件工程智能代理:任务委托与自动化实践全解
  • Spring Boot Actuator 监控功能的简介及禁用
  • Java面试题036:一文深入了解VUE(1)
  • 批量提问程序开发方案:基于Python的百度文小言接口实现
  • 学习嵌入式之硬件——ARM体系
  • vue margin与padding对比
  • 用户体验设计中微投入设计:用户不知不觉付出的 3 种方式
  • 【24】C++实战篇——【 C++ 外部变量】 C++多个文件共用一个枚举变量,外部变量 extern,枚举外部变量 enum
  • Kaggle 经典竞赛泰坦尼克号:超级无敌爆炸详细基础逐行讲解Pytorch实现代码,看完保证你也会!!!
  • 直播间自动发言工具的开发
  • OpenAI/gpt-oss开源模型部署与使用全指南