期望长度

定义

这里期望长度表示一段序列连续长度的期望。具体来说,对于一段序列,每个点都有一个概率连续断开。求所有连续序列和的期望。

当然,对于以上期望长度的定义,我们只需要求出每个点存在的期望的和即可。但是题目永远不会这么简单。

Osu!

Osu!是一个音乐游戏,玩家需要对音符在恰当时候进行敲击来通关。一次到位的敲击为o,不到位的为x。一段连续到位的敲击,即combo次数为这段序列的长度。

我们接下来讨论的三个题都和这个游戏有关。


  • level1

一段Osu!序列为一串字符,包括'o','x','?'。其中'o','x'的定义如上,'?'表示此位置有一半的几率为'o'。游戏得分为所有combo次数平方的和。求得分的期望。

也就是我们要求所有序列长度平方的期望和。

期望

期望具有线性性,但不具有积性。这意味着我们无法对求得的期望长度直接平方来得到答案。

并且请注意一点,若一个值的期望为0,并不意味着它的平方的期望为0。这可以帮助我们理解期望的线性性。

期望的平方在大多数情况下并没有什么实际意义。

但是,期望具有线性性。

考虑我们的答案,实际上就是长度平方的期望。考虑往后的转移。(设\(f1\)表示当前期望长度,\(f2\)表示答案,即长度平方期望的和)

根据公式\((len+1)^2=len^2+2*len+1\)若后一位\(i\)为'o',则后一位\(i\)的期望值分别为

\(f1_i=f1_{i-1}+1\)

\(f2_i=f2_{i-1}+2*f1_{i-1}+1\)

即此位\(f2\)的值其实是可以从前一位线性转移来的。所谓线性,就是其幂为1。

同样,考虑第\(i\)位为'x'的情况,\(f1=0\),\(f2\)直接继承前面的答案。

然后我们就可以得到'?'的情况:上述两种情况和除以2.

\(f1_i=\frac{f1_{i-1}+1}2\)

\(f2_i=\frac{2*f2_{i-1}+2*f1_{i-1}+1}{2}\)

于是我们就能完成P1365

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
inline int read(){
int x=0,w=0;char c=getchar();
while(!isdigit(c))w|=c=='-',c=getchar();
while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();
return w?-x:x;
}
namespace star
{
int n;
double f,len,p;
inline void work(){
n=read();
char c=getchar();
while(c!='o' and c!='?' and c!='x')c=getchar();
while(n--){
if(c=='o')f=(f+2*len+1),len=len+1;
else if(c=='?')f=(2*(f+len)+1)/2,len=(len+1)/2;
else len=0;
}
printf("%.4lf",f);
}
}
signed main(){
star::work();
return 0;
}

  • level2

我们发现,其实对于概率任意的情况也可以推出来。上题三种字符其实就是对应概率为1,0.5,0的三种情况。

设\(p\)为该点为'o'的概率,则有:

\(f2_i=f2_{i-1}+p*(2*f1_{i-1}+1)\)

\(f1_i=p*(f1_{i-1}+1)\)

所以上题的代码的核心部分等同于:

	while(n--){
p=c=='o'?1.0:c=='?'?0.5:0.0;
f=f+p*(2*len+1);
len=p*(len+1);
c=getchar();
}

于是我们可以完成CF235B

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
inline int read(){
int x=0,w=0;char c=getchar();
while(!isdigit(c))w|=c=='-',c=getchar();
while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();
return w?-x:x;
}
namespace star
{
int n;
double f,len,p;
inline void work(){
n=read();
while(n--){
scanf("%lf",&p);
f=(f-len*len+(len+1)*(len+1))*p+f*(1-p);
len=p*(len+1);
}
printf("%.8lf",f);
}
}
signed main(){
star::work();
return 0;
}

  • level3

我们已经完成了对于长度平方的期望和的问题。那么我们就可以解决新的问题:对于答案为所有combo长度立方的和的期望我们怎么求解呢?

根据期望的线性性,我们再维护一个平方的期望即可。

根据公式\((len+1)^3=len^3+3len^2+3len+1\),我们可以得到以下转移:

\[f3_i=f3_{i-1}+p*(3*(f2_{i-1}+f1_{i-1})+1)\\
f2_i=p*(f2_{i-1}+2*f1_{i-1}+1)\\
f1_i=p*(f1_{i-1}+1);
\]

注意!

我承认我的变量名的定义有亿点点毒瘤,因为读者可以清楚地发现在上一题中\(f2\)的转移为\(f2_i=f2_{i-1}+p*(2*f1_{i-1}+1)\)而非当前转移。实际上在定义\(f2\)时我的定义为答案而非二次项的期望,根据期望的线性性,答案是可以继承上一次的答案进行转移的,也就是对于'x'的情况继承\(f2\)而非\(0\)的原因。

在此level中我对\(f2\)重新定义为长度二次幂的期望。希望不要因为我的毒瘤误导大家。

相同的,我对\(f3\)的定义为答案,因此需要继承之前的答案。

于是我们就完成了P1654

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
inline int read(){
int x=0,w=0;char c=getchar();
while(!isdigit(c))w|=c=='-',c=getchar();
while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();
return w?-x:x;
}
namespace star
{
int n;
double f1,f2,f3;
inline void work(){
n=read();
double p;
while(n--){
scanf("%lf",&p);
f3=f3+p*(3*(f2+f1)+1);
f2=p*(f2+2*f1+1);
f1=p*(f1+1);
}
printf("%.1lf",f3);
}
}
signed main(){
star::work();
return 0;
}

总结

期望好神奇。

期望长度P1365,CF235B,P1654的更多相关文章

  1. 洛谷P1365 WJMZBMR打osu! / Easy——期望DP

    题目:https://www.luogu.org/problemnew/show/P1365 平方和怎样递推? 其实就是 (x+1)^2 = x^2 + 2*x + 1: 所以我们要关注这里的 x — ...

  2. 概率和期望dp

    概率和期望dp 概率和期望好神啊,完全不会. 网上说概率要顺着推,期望要逆着推,然而我目前做的概率期望题正好都与此相反2333   概率: 关于概率:他非常健康 初中概率题非常恐怖.现在来思考一道题: ...

  3. 期望dp BZOJ3450+BZOJ4318

    BZOJ3450 概率期望DP f[i]表示到i的期望得分,g[i]表示到i的期望长度. 分三种情况转移: ① s[i]=‘x’:f[i]=f[i-1],g[i]=0 ② s[i]=‘o’:f[i]= ...

  4. tyvj P1952 Easy(递推+期望)

    P1952 Easy 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:(我们来简化一下 ...

  5. Codeforces 123E Maze(树形DP+期望)

    [题目链接] http://codeforces.com/problemset/problem/123/E [题目大意] 给出一棵,给出从每个点出发的概率和以每个点为终点的概率,求出每次按照dfs序从 ...

  6. bzoj-3450 Easy概率DP 【数学期望】

    Description 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:(我们来简化一下这个游戏的规则有n次点击要做,成功了就是o,失败了就是x,分数是按comb计算的,连续a ...

  7. [ZJOI2015]地震后的幻想乡(期望+dp)

    题目描述 傲娇少女幽香是一个很萌很萌的妹子,而且她非常非常地有爱心,很喜欢为幻想乡的人们做一些自己力所能及的事情来帮助他们. 这不,幻想乡突然发生了地震,所有的道路都崩塌了.现在的首要任务是尽快让幻想 ...

  8. 【题解】 bzoj3450 JoyOI1952 Easy (期望dp)

    题面戳我 Solution 期望的题目真心不太会 定义状态\(f[i]\)表示到第\(i\)期望长度,\(dp[i]\)表示期望分数 如果上一步的持续\(o\)长度为\(L\),那么贡献是\(L^2\ ...

  9. #3 Codeforces-865C Gotta Go Fast(期望dp)

    题意:一个游戏一共有n个关卡,对于第i关,用a[i]时间通过的概率为p[i],用b[i]通过的时间为1-p[i],每通过一关后可以选择继续下一关或者时间清0并从第一关开始,先要求通过所有关卡的时间和不 ...

随机推荐

  1. Java 将PPT幻灯片转为HTML

    本文以Java程序代码为例展示如何通过格式转换的方式将PPT幻灯片文档转为HTML文件.这里的PPT幻灯片可以是.ppt/.pptx/.pps/.ppsx/.potx等格式. 代码实现思路:[加载PP ...

  2. Java 面试题关于包装类

    这几个问题的知识点涉及的内容非常的刁钻,值得自己好好的理解. 问以下程序的输出结果是: 问题一: Object object=true ? new Integer(1):new Double(2.0) ...

  3. springmvc自定义的拦截器以及拦截器的配置

    一.自定义拦截器 Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口. 二.HandlerIn ...

  4. 为IHttpClientFactory添加动态命名配置

    某些时候我们需要为HttpClient动态配置一些东西, 例如证书等, 参考博问 如何使用IHttpClientFactory动态添加cer证书. 例如服务是一个回调服务, 而被回调方采用了自定义的h ...

  5. Nexus 安装配置教程

    目录 为什么使用 Nexus Docker 模式安装 Nexus 使用 data volume 使用本地目录 Nexus 配置 配置 Blob Stores Nexus 使用 包下载 包上传 参考 为 ...

  6. Linux命令大全之查看登陆用户信息

    1,w +回车 2.who +回车 3.last+回车 4.lastlog+回车

  7. 入“坑”mybatis后如何挣脱?

    既然已经入"坑"mybatis了,你竟然还想着挣脱,我是不会让你挣脱的~ 当然我有一个算是挣脱的办法.那就是把它学会.理解透.这样我们也就不用在坑里一直徘徊,也算得上是一种挣脱吧! ...

  8. MediaStore 与Media.EXTERNAL_CONTENT_URI

    MediaStore这个类是Android系统提供的一个多媒体数据库,android中多媒体信息都可以从这里提取. 这个MediaStore包括了多媒体数据库的所有信息,包括音频,视频和图像,andr ...

  9. php 安装 yii 报错: phpunit/phpunit 4.8.32 requires ext-dom *

    php 安装 yii 报错: phpunit/phpunit 4.8.32 requires ext-dom * 我的版本是7.0,以7.0为例演示. 先装这两个拓展试试: sudo apt-get ...

  10. EXCEL根据某一列单元格特定标点符号分行,其它列内容一致

    注意事项:此方法注意运用excel空值单元格填充,因此数据处理之前,如果存在值为空的,请特殊处理,后期处理完再替换为原来的空值 1.在决定分行数的列后插入一列 2.根据逗号之前值最多的数量来决定分行数 ...