题目描述

某一天\(WJMZBMR\)在打\(osu\)~~~但是他太弱逼了,有些地方完全靠运气\(QaQ\)

我们来简化一下这个游戏的规则

有\(n\)次点击要做,成功了就是\(o\),失败了就是\(x\),分数是按\(comb\)计算的,连续\(a\)个\(comb\)就有\(a\times a\)分,\(comb\)就是极大的连续\(o\)。比如\(ooxxxxooooxxx\),分数就是\(2\times 2+4 \times 4=4+16=20\)。

\(Sevenkplus\)闲的慌就看他打了一盘,有些地方跟运气无关要么是\(o\)要么是\(x\),有些地方\(o\)或者\(x\)各有\(50\%\)的可能性,用\(?\)号来表示。比如\(oo?xx\)就是一个可能的输入。

那么\(WJMZBMR\)这场\(osu\)的期望得分是多少呢?比如\(oo?xx\)的话,\(?\)是\(o\)的话就是\(oooxx >= 9\),是\(x\)的话就是\(ooxxx >= 4\) 期望自然就是\({(4+9)\over2}=6.5\)了

输入格式

第一行一个整数\(n\),表示点击的个数

接下来一个字符串,每个字符都是\(ox?\)中的一个

输出格式

一行一个浮点数表示答案

四舍五入到小数点后\(4\)位

如果害怕精度跪建议用\(long double\)或者\(extended\)

样例输入

4

????

样例输出

4.1250

数据范围与提示

\(n<=300000\)

\(osu\)很好玩的哦

\(WJMZBMR\)技术还行(雾),\(x\)基本上很少呢

分析

这个题和\(OSU!\)其实差别不大,也就是每个位置都有两种情况,然后就可以开始分析状态转移方程了:

首先利用两个数组\(f[i]\)和\(g[i]\),一个代表前\(i\)总得分,另一个代表前\(i\)总长度。

总长度这个当然很好进行状态转移,首先是当这一位是\(o\),那么就可以直接\(g[i]=g[i-1]+1\)。其次是这一位成为了\(x\),那么\(g[i]\)就置为\(0\)。第三种就是\(?\)的情况,因为\(o\)和\(x\)各为\(50\%\)的概率,所以\(g[i]=0.5\times(g[i-1]+1)+0\times 0.5\),到最后\(g[i]\)的状态转移方程就是\(g[i] ={ {g[i-1]+1}\over2}\)。

其次就是期望也就是得分的状态转移的方程了:

假如这一位是\(o\)的话,那么\(f[i]\)就是相当与上一位为\(x\),这一位为\(x+1\),那么变化量也就是\(2x+1\),所以状态转移方程就是

\[f[i]=f[i−1]+2\times g[i−1]+1
\]

\[g[i]=g[i-1]+1
\]

假如这一位是\(x\)的话,那么得分也就是不变了,只需要把\(g[i]\)改成\(0\)即可,状态转移方程就是

\[f[i]=f[i−1],g[i]=0
\]

第三种就是\(?\)的情况,因为每种情况都是\(0.5\)的概率,所以状态转移方程就很好想了,就是

\[f[i]=0.5\times (f[i−1]+2\times [i−1]+1)+0.5\times f[i−1]
\]

\[g[i]=0.5\times g[i−1]+1)+0.5\times 0
\]

按这三个进行状态转移就行了,下边是代码。

代码

#include<bits/stdc++.h>
const int maxn = 3e5+10;
int n;
double f[maxn];
double g[maxn];
char ch[maxn]; int main(){
scanf("%d ",&n);
scanf("%s",ch+1);
for(int i=1;i<=n;i++){
if(ch[i]=='o'){
f[i]=f[i-1]+2*g[i-1]+1;
g[i]=g[i-1]+1;
}
else if(ch[i]=='x'){
f[i]=f[i-1];
g[i]=0;
}
else{
g[i]=(g[i-1]+1)/2.0;
f[i]=0.5*f[i-1]+0.5*(f[i-1]+2*g[i-1]+1);
}
}
printf("%.4lf\n",f[n]);
return 0;
}

Easy [还是概率DP思想……]的更多相关文章

  1. Codeforces Round #388 (Div. 2) 749E(巧妙的概率dp思想)

    题目大意 给定一个1到n的排列,然后随机选取一个区间,让这个区间内的数随机改变顺序,问这样的一次操作后,该排列的逆序数的期望是多少 首先,一个随机的长度为len的排列的逆序数是(len)*(len-1 ...

  2. POJ2151-Check the difficulty of problems(概率DP)

    Check the difficulty of problems Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4512   ...

  3. bzoj 3450 Tyvj1952 Easy (概率dp)

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

  4. [转]概率DP总结 by kuangbin

    概率类题目一直比较弱,准备把kuangbin大师傅总结的这篇题刷一下! 我把下面的代码换成了自己的代码! 原文地址:http://www.cnblogs.com/kuangbin/archive/20 ...

  5. 动态规划——概率dp

    所谓概率dp,用动态规划的思想找到一个事件中可能发生的所有情况,然后找到符合要求的那些情况数,除以总数便可以得到符合要求的事件发生的概率.其核心思想还是通过dp来得到事件发生的所有情况,很类似在背包专 ...

  6. POJ2151Check the difficulty of problems 概率DP

    概率DP,还是有点恶心的哈,这道题目真是绕,问你T个队伍.m个题目.每一个队伍做出哪道题的概率都给了.冠军队伍至少也解除n道题目,全部队伍都要出题,问你概率为多少? 一開始感觉是个二维的,然后推啊推啊 ...

  7. 【POJ】2151:Check the difficulty of problems【概率DP】

    Check the difficulty of problems Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8903   ...

  8. [NOIP2016 D1T3]换教室 【floyd+概率dp】

    题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n2n 节课程安排在 nn 个时间段上.在第 ii(1 \leq i \leq n1≤ ...

  9. hdu 4576(简单概率dp | 矩阵优化)

    艰难的一道题,体现出菜菜的我... 首先,先吐槽下. 这题到底出题人是怎么想的,用普通概率dp水过??? 那为什么我概率dp写的稍微烂点就一直tle?  感觉很不公平.大家算法都一致,因为我程序没有那 ...

随机推荐

  1. 分享两个常用的rem布局方式

    关于rem 这种技术需要一个参考点,一般都是以<body>的“font-size”为基准. 比如我们设置body,html的字体大小为10px:那么1rem就是10px, 这样一来,我们设 ...

  2. DDD之3实体和值对象

    图中是一个别墅的模型,代表实体,可以真实的看得到.那么在DDD设计方法论中,实体和值对象是什么呢? 背景 实体和值对象是领域模型中的领域对象,是组成领域模型的基础单元,一起实现实体最基本的核心领域逻辑 ...

  3. Java实现 LeetCode 821 字符的最短距离(暴力)

    821. 字符的最短距离 给定一个字符串 S 和一个字符 C.返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组. 示例 1: 输入: S = "loveleet ...

  4. Java实现 LeetCode 592 分数加减运算(纯体力活)

    592. 分数加减运算 给定一个表示分数加减运算表达式的字符串,你需要返回一个字符串形式的计算结果. 这个结果应该是不可约分的分数,即最简分数. 如果最终结果是一个整数,例如 2,你需要将它转换成分数 ...

  5. Java实现 LeetCode 459 重复的子字符串

    459. 重复的子字符串 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成.给定的字符串只含有小写英文字母,并且长度不超过10000. 示例 1: 输入: "abab" ...

  6. Java实现蓝桥杯VIP算法训练 奇变的字符串

    试题 算法训练 奇变的字符串 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 将一个字符串的奇数位(首位为第0位)取出,将其顺序弄反,再放回原字符串的原位置上. 如字符串" ...

  7. java代码(2)---Java8 Stream

    stream Java8新特性Stream流,那Stream表达式到底是什么呢,为什么可以使你的代码更加整洁而且对集合的操作效率也会大大提高? 一.概述 1.什么是Stream Stream是一种可供 ...

  8. jmeter 性能测试入门手册分享

    深思熟虑之下,决定把这份性能测试入门手册分享给大家 最初整理这份教程的是因为自己在学习性能测试的过程中踩过了很多的坑,遇到了 数不清的问题,于是就想着将这些解决的问题全都归拢在一个文档里,方便自己查阅 ...

  9. tp5的 LayUI分页样式实现

    1.先配置你的分页参数: //分页配置 'paginate'      => [ 'type'      => 'Layui', 'var_page'  => 'page', 'li ...

  10. SpringBoot后端系统的基础架构

    前言 前段时间完成了毕业设计课题--<基于Spring Boot + Vue的直播后台管理系统>,项目名为LBMS,主要完成了对直播平台数据的可视化展示和分级的权限管理.虽然相当顺利地通过 ...