BZOJ 4318: OSU! 期望DP
2015-12-22 23:39
246 查看
4318: OSU!
题目连接:
http://www.lydsy.com/JudgeOnline/problem.php?id=4318Description
osu 是一款群众喜闻乐见的休闲软件。我们可以把osu的规则简化与改编成以下的样子:
一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1个长度为n的01串。在这个串中连续的 X个1可以贡献X^3 的分数,这x个1不能被其他连续的1所包含(也就是极长的一串1,具体见样例解释)
现在给出n,以及每个操作的成功率,请你输出期望分数,输出四舍五入后保留1位小数。
Input
第一行有一个正整数n,表示操作个数。接下去n行每行有一个[0,1]之间的实数,表示每个操作的成功率。Output
只有一个实数,表示答案。答案四舍五入后保留1位小数。Sample Input
30.5
0.5
0.5
Sample Output
6.0Hint
【样例说明】000分数为0,001分数为1,010分数为1,100分数为1,101分数为2,110分数为8,011分数为8,111分数为27,总和为48,期望为48/8=6.0
N<=100000
题意
题解:
如果这个位置是0,那么贡献为0,如果这个位置是1,那么贡献为(x+1)^3-x^3=3x^2+3x+1,x为当前1长度的期望然后扫一遍就好了,维护一个x的期望,和x^2的期望
代码
#include<bits/stdc++.h> using namespace std; int n; double dp[100005][3]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { double x;scanf("%lf",&x); dp[i][0]=(dp[i-1][0]+1)*x; dp[i][1]=(dp[i-1][1]+2*dp[i-1][0]+1)*x; dp[i][2]=dp[i-1][2]+(3*dp[i-1][1]+3*dp[i-1][0]+1)*x; } printf("%.1f\n",dp [2]); }
相关文章推荐
- java编写服务_客户端通信实例讲解(适合初学者)
- hdu 1372 Knight Movies(bfs)
- 函数调用中堆栈的个人理解
- 消息完整性与数字签名
- JVM OS::init()源码分析
- Servlet的生命周期
- 刚刚学了类,做了一个简单的发牌功能
- 16.未公开的Oracle数据库秘密笔记——X$BH表与闩锁争用
- 魔兽世界终极版(C++程序设计第6周)
- 例题5-7 UVA 136 Ugly Numbers丑数(set+优先队列)
- 使用jQuery发送Ajax请求
- mysql binlog系列(二)----java解析binlog
- 15.未公开的Oracle数据库秘密笔记——X$固定表介绍
- Android 资源管理 Asset 、Raw 和Drawable
- 图的深度优先遍历算法
- bzoj3275 Number
- ORCAL
- linux下进程资源的限制——struct rlimit详解
- 实验1 线性表的顺序实现
- scala习题九——文件和正则表达式