Easy [还是概率DP思想……]
题目描述
某一天\(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\),所以状态转移方程就是
\]
\]
假如这一位是\(x\)的话,那么得分也就是不变了,只需要把\(g[i]\)改成\(0\)即可,状态转移方程就是
\]
第三种就是\(?\)的情况,因为每种情况都是\(0.5\)的概率,所以状态转移方程就很好想了,就是
\]
\]
按这三个进行状态转移就行了,下边是代码。
代码
#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思想……]的更多相关文章
- Codeforces Round #388 (Div. 2) 749E(巧妙的概率dp思想)
题目大意 给定一个1到n的排列,然后随机选取一个区间,让这个区间内的数随机改变顺序,问这样的一次操作后,该排列的逆序数的期望是多少 首先,一个随机的长度为len的排列的逆序数是(len)*(len-1 ...
- POJ2151-Check the difficulty of problems(概率DP)
Check the difficulty of problems Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4512 ...
- bzoj 3450 Tyvj1952 Easy (概率dp)
3450: Tyvj1952 Easy Description 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:(我们来简化一下这个游戏的规则有n次点击要做,成功了就是o,失败 ...
- [转]概率DP总结 by kuangbin
概率类题目一直比较弱,准备把kuangbin大师傅总结的这篇题刷一下! 我把下面的代码换成了自己的代码! 原文地址:http://www.cnblogs.com/kuangbin/archive/20 ...
- 动态规划——概率dp
所谓概率dp,用动态规划的思想找到一个事件中可能发生的所有情况,然后找到符合要求的那些情况数,除以总数便可以得到符合要求的事件发生的概率.其核心思想还是通过dp来得到事件发生的所有情况,很类似在背包专 ...
- POJ2151Check the difficulty of problems 概率DP
概率DP,还是有点恶心的哈,这道题目真是绕,问你T个队伍.m个题目.每一个队伍做出哪道题的概率都给了.冠军队伍至少也解除n道题目,全部队伍都要出题,问你概率为多少? 一開始感觉是个二维的,然后推啊推啊 ...
- 【POJ】2151:Check the difficulty of problems【概率DP】
Check the difficulty of problems Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8903 ...
- [NOIP2016 D1T3]换教室 【floyd+概率dp】
题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n2n 节课程安排在 nn 个时间段上.在第 ii(1 \leq i \leq n1≤ ...
- hdu 4576(简单概率dp | 矩阵优化)
艰难的一道题,体现出菜菜的我... 首先,先吐槽下. 这题到底出题人是怎么想的,用普通概率dp水过??? 那为什么我概率dp写的稍微烂点就一直tle? 感觉很不公平.大家算法都一致,因为我程序没有那 ...
随机推荐
- Java实现 蓝桥杯 历届试题 连号区间数
问题描述 小明这些天一直在思考这样一个奇怪而有趣的问题: 在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是: 如果区间[L, R] 里的所有元素(即此排列的第L个到第R个元素)递增 ...
- 曹工说JDK源码(1)--ConcurrentHashMap,扩容前大家同在一个哈希桶,为啥扩容后,你去新数组的高位,我只能去低位?
如何计算,一对key/value应该放在哪个哈希桶 大家都知道,hashmap底层是数组+链表(不讨论红黑树的情况),其中,这个数组,我们一般叫做哈希桶,大家如果去看jdk的源码,会发现里面有一些变量 ...
- 获取Google浏览器保存的密码
获取Google中保存的密码 直接在浏览器上输入 chrome://settings/passwords
- MySql多表查询优化
一.多表查询连接的选择 相信内连接,左连接什么的大家都比较熟悉了,当然还有左外连接什么的,基本用不上,我就补贴出来了,这个图只是让大家熟悉一下各种连接查询.然后要告诉大家的是,需要根据查询的信息,想好 ...
- Action的三种实现方式,struts.xml配置的详细解释及其简单执行过程(二)
勿以恶小而为之,勿以善小而不为--------------------------刘备 劝诸君,多行善事积福报,莫作恶 上一章简单介绍了Struts2的'两个蝴蝶飞,你好' (一),如果没有看过,请观 ...
- v-bind 缩写
Vue.js 为两个最为常用的指令提供了特别的缩写: <!-- 完整语法 --> <a v-bind:href="url"></a> <! ...
- 如何在宝塔上的Nginx实现负载均衡
创建一个指向服务器本身的localhost站点(127.0.0.1)和一个指向服务器的站点,域名和IP都可以. I.对域名站点配置: upstream myproj { server 127.0.0 ...
- 别人开发三年30k,而我才12K,看完他面试前狂刷的面试题,我惊了
朋友做Java开发三年多的时间了,在老东家勤勤恳恳工作了三年多,工资也就是从刚开始的8K涨到了12K,天天给我吐槽他的工资低.2019年中下旬开始就一直在各种地方找资源,刷面试题,想要“骑驴找马”,所 ...
- Astah类图中使用list<>
如何在类图中表示如下的属性,这个问题困扰了我好久.之前百度找不着任何相关的内容,今天终于在其官方论坛找着了答案. class cMeterRecord { protected: cMeterStatu ...
- easypoi 读取 Excel 简单应用
背景 在做接口测试的时候,经常会使用 Excel 来存储对应的接口信息和用例信息,为了方便程序的读取,引入easypoi 工具来读取 Excel 内容.easypoi 比起 poi 使用更加的方便,代 ...