●BZOJ 4318 OSU!
题链:
http://www.lydsy.com/JudgeOnline/problem.php?id=4318
题解:
期望dp
如果我们能够得到以每个位置结尾形成的连续1的长度的相关期望,那么问题就好解决了。
定义g[i]表示以1位置结尾的连续1的长度的期望。
转移显然:g[i]=p[i]*(g[i]+1)
然后定义h[i]表示以1位置结尾的连续1的长度的平方的期望
由于(x+1)^2=x^2+2x+1,
所以h[i]=p[i]*(h[i-1]+2*g[i-1]+1)
最后定义f[i]表示1~i这个区间期望能得到的分数,
分为此时i位置得到1和得到0两种情况:
得到1,由于(x+1)^3=x^3+3*x^2+3x+1 那么贡献为:p[i]*(f[i-1]+3*h[i-1]+3*g[i-1]+1)
得到0,那么直接为前面的期望得分,贡献为(1-p[i])*f[i-1]
所以f[i]的转移为:f[i]=(得到1)p[i]*(f[i-1]+3*h[i-1]+3*g[i-1]+1)+(得到0)(1-p)*f[i-1];
.....................................................................
==,难道没有感觉这个f[i]的转移有一丝丝诡异么?
先看看这个错的做法,
多了一个d[i],表示以i结尾形成的连续1的长度的3次方的期望。
那么其转移类似g和h的转移:
d[i]=p[i]*(d[i-1]+3*h[i-1]+3*g[i-1]+1)
然后再去求得f[i],同样地分为当前第i位得到1和得到0两种情况:
f[i]=(得到1)d[i]+(得到0)(1-p[i])*f[i-1]
乍一看似乎没问题,但是在(得到1)那里却出了问题:
f[i]表示的是1~i这个区间期望能够得到的分数,
但是在(得到1)这个转移这里,我们却只考虑了以i结尾的期望的那段1的贡献,然而其它部分的贡献就没有转移过来。
这也就是这个做法得到的答案比正确答案小的原因。
(可以强行把之前的贡献再加进来么?233,我反正加不来。。。)
.......................................................................
现在再反过来看看之前正确的f[i]的求法(没有d[i]数组的那个做法)
f[i]=(得到1)p[i]*(f[i-1]+3*h[i-1]+3*g[i-1]+1)+(得到0)(1-p)*f[i-1];
显然(得到0)的那个转移没有问题。
那么我们来想想(得到1)的那么那个转移是如何解决掉那个错误做法出现的问题的。
由于f[i-1]表示的是区间1~i-1的期望得分,
那么我们就可以把f[i-1]看成是由两个部分组成的:
一个部分是以i-1结尾的期望的那段连续的1造成的贡献A(一个长度的3次方的期望),另一部分则是其它部分的贡献B:
所以(得到1)这个转移可以看成是:p[i]*(B+A+3*h[i-1]+3*g[i-1]+1),
显然,后面的A+3*h[i-1]+3*g[i-1]+1计算的就是以i结尾形成的连续1的长度的3次方的期望,
而B则是其它部分的贡献。
所以就是这样巧妙地把新的贡献和其它部分的贡献都统计进了f[i]里面。
以上就是个人的见解。
代码:
#include<bits/stdc++.h>
#define MAXN 100005
using namespace std;
double g[MAXN],h[MAXN],f[MAXN],p;
int N;
int main(){
ios::sync_with_stdio(0);
cin>>N;
for(int i=1;i<=N;i++){
cin>>p;
g[i]=p*(g[i-1]+1);
h[i]=p*(h[i-1]+2*g[i-1]+1);
f[i]=p*(f[i-1]+3*h[i-1]+3*g[i-1]+1)+(1-p)*f[i-1];
}
cout<<fixed<<setprecision(1)<<f[N]<<endl;
return 0;
}
●BZOJ 4318 OSU!的更多相关文章
- BZOJ 4318: OSU! 期望DP
4318: OSU! 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4318 Description osu 是一款群众喜闻乐见的休闲软件 ...
- BZOJ 4318 OSU!(概率DP)
题意 osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: 一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1个长度为n的01串.在 ...
- bzoj 4318 OSU! - 动态规划 - 概率与期望
Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: 一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1 ...
- BZOJ - 4318: OSU! (期望DP&Attention)
Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: 一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1 ...
- BZOJ 4318: OSU! 期望概率dp && 【BZOJ3450】【Tyvj1952】Easy 概率DP
这两道题是一样的...... 我就说一下较难的那个 OSU!: 这道15行的水题我竟然做了两节课...... 若是f[i][0]=(1-p)*f[i-1][0]+(1-p)*f[i-1][1],f[i ...
- bzoj 4318 OSU! —— 期望DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4318 期望DP,因为平方的期望不等于期望的平方,所以用公式递推: 第一次推错了囧,还是看这位 ...
- bzoj 4318 OSU!
期望dp. 考虑问题的简化版:一个数列有n个数,每位有pi的概率为1,否则为0.求以每一位结尾的全为1的后缀长度的期望. 递推就好了. l1[i]=(l1[i-1]+1)*p[i]+0*(1-p[i] ...
- BZOJ 4318: OSU! [DP 概率]
传送门 题意:变成了告诉每个操作的成功概率,并且得分是三次方 一样....分别维护$x,\ x^2,\ x^3$的期望就行了 注意$x^3$是我们最终求的得分,即使失败得分也要累加上之前的 #incl ...
- bzoj 4318 OSU 概率期望dp
可以发现:f[i]转移到f[i+1]只和最后一串1的长度和平方有关, 因为如果新加的位置是1,贡献就是(x+1)^3-x^3=3x^2+3x+1,否则为0: 所以对于每一个位置,处理出期望的f,x和x ...
随机推荐
- C语言第一次作业——输入输出格式
题目1温度转换 本题要求编写程序,计算华氏温度150°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1.实验代码 #include& ...
- 2017-2018-1 Java演绎法 小组成员贡献量汇总
[第一周]贡献量(31) [说明] 完成情况 是指 每次是否全部完成分配的任务,如果全部完成贡献量记为1,否则记为0,与贡献量(时间量)相加计算贡献比例,由于前十周有具体的任务分配,Alpha阶段(第 ...
- Beta版本展示
Beta版本展示 开发团队:MyGod 团队成员:程环宇 张芷祎 王田路 张宇光 王婷婷 源码地址:https://github.com/WHUSE2017/MyGod MyGod团队项目的目标: 让 ...
- 团队作业8——测试与发布(Beta阶段)
Deadline: 2017-12-17 23:00PM,以博客发表日期为准. 评分基准: 按时交 - 有分,检查的项目包括后文的三个方面 测试报告 发布说明 展示博客(单独一篇博客) 晚交 - ...
- C程序第一次作业
1-1 计算两数的和与差 1 设计思路 (1)主要描述题目算法 第一步:利用指针psum接收sum的地址,指针pdiff接收diff的地址,因此 * psum为sum, * pdiff为diff. 第 ...
- 20162328蔡文琛week07
学号 2016-2017-2 <程序设计与数据结构>第X周学习总结 教材学习内容总结 多态引用在不同的时候可以指向不同类型的对象. 多态引用在运行时才将方法调用用于它的定义绑定在一起. 引 ...
- 201621123057 《Java程序设计》第3周学习总结
1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识点组织起来.请使用工具画出本周学习到的知识点及知识点之间的联系.步骤如下: 1.1 写出你 ...
- Log4j详细教程
一.入门实例 1.新建一个JAva工程,导入包log4j-1.2.17.jar,整个工程最终目录如下 2.src同级创建并设置log4j.properties ### 设置### log4j.root ...
- linux 下 nc 命令的使用
netcat被誉为网络安全界的'瑞士军刀',一个简单而有用的工具,透过使用TCP或UDP协议的网络连接去读写数据.它被设计成一个稳定的后门工具,能够直接由其它程序和脚本轻松驱动.同时,它也是一个功能强 ...
- js前端对后台数据的获取,如果是汉字则需要添上引号
js前端对后台数据的获取,如果是汉字则需要添上引号