期望长度

定义

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

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

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. Selenium-python 之 frame定位元素

    定位元素时经常会出现定位不到元素,这时候我们需要观察标签的上下文,一般情况下这些定位不到的元素存放在了frame或者放到窗口了,只要我们切入进去就可以很容易定位到元素. 处理frame时主要使用到sw ...

  2. Django(60)Django内置User模型源码分析及自定义User

    前言 Django为我们提供了内置的User模型,不需要我们再额外定义用户模型,建立用户体系了.它的完整的路径是在django.contrib.auth.models.User. User模型源码分析 ...

  3. 阿里面试挂了,就因为面试官说我Spring 事务管理(器)不熟练?

    前言 事务管理,一个被说烂的也被看烂的话题,还是八股文中的基础股之一.但除了八股文中需要熟读并背诵的那些个传播行为之外,背后的"为什么"和核心原理更为重要. ​ 写这篇文章之前,我 ...

  4. H5播放需要解密的m3u8音频文件

    <audio ref="audio"></audio> import CryptoJS from "crypto-js"; import ...

  5. 从1+1=2来理解Java字节码从1+1=2来理解Java字节码

    编译"1+1"代码 首先我们需要写个简单的小程序,1+1的程序,学习就要从最简单的1+1开始,代码如下: 写好java类文件后,首先执行命令javac TestJava.java ...

  6. Windows10无线能连上但没有网络

    解决思路:重置widows10网络配置 步骤: 1.win+X键 2.在命令提示符窗口中,输入命令行:netsh winsock reset 3.然后按下回车键,这时就会提示重置Winsock目录成功 ...

  7. Winform中用户自定义控件中外部设置子控件属性的方法

    假设我们新建立一个用户自定义控件,由一个lable1和pictureBox1组成 此时我们在外部调用该控件,然后想动态改变lable1的值,我们该怎么办? 假设实例化的用户控件名为UserContro ...

  8. asp.net core 实现 face recognition 使用 tensorflowjs(源代码)

    功能描述 上传照片文件名及是系统要识别标签或是照片的名称(人物标识) 提取照片脸部特征值(调用 facemesh模型) 保存特征值添加样本(调用 knnClassifier) 测试上传的图片是否识别正 ...

  9. Java基础-封装和继承

    @ 目录 Java基础知识(封装和继承) 一. 封装 1.1 封装的目的 1.2 封装的好处 1.3 封装的步骤 1.4 封装的例子 1.5 小结 二. 继承 2.1 继承的介绍 2.2 生活中的继承 ...

  10. 安装nodejs版本模块报错notsup Unsupported platform for n

    使用npm install -g n报错 如果出现npm ERR! notsup Unsupported platform for n@6.7.0: wanted {"os":&q ...