CodeForces - 236D Let‘s Play Osu!(概率dp)
题目链接:点击查看
题目大意:给出一个长度为 nnn 的字符串,第 iii 个位置有 pip_ipi 的概率为 OOO,有 1−pi1-p_i1−pi 的概率为 XXX,本题的贡献指的是,连续 OOO 的个数的平方,问贡献的期望是多少
题目分析:如果按照正常思路不难想到一个 n2n^2n2 的 dpdpdp,大概就是 dpi,jdp_{i,j}dpi,j 表示到了第 iii 个位置结束,选还是不选第 iii 个位置的期望,转移的话一层枚举位置,另一层枚举最后一个 OOO 的长度即可,不过很可惜这个题没法这样去想
考虑平方展开,假设 LLL 为原本的 OOO 的长度,当 L→L+1L \to L+1L→L+1 后,贡献会增加:
(L+1)2−L2=(L2+2L+1)−L2=2L+1\begin{aligned} &(L+1)^2-L^2 \\ &=(L^2+2L+1)-L^2 \\ &=2L+1 \end{aligned} (L+1)2−L2=(L2+2L+1)−L2=2L+1
如此一来我们就可以线性维护一下期望长度,利用期望长度来计算贡献了
期望长度的线性转移话可以参考概率 dpdpdp 的入门题目:SDUT - 2623 The number of steps
假设到了第 i−1i-1i−1 个位置的期望长度为 lenlenlen,那么到了第 iii 个位置时只有两种情况:
- 第 iii 个位置选择 OOO 与前面的 OOO 连起来,期望长度变为 len+1len+1len+1,概率为 pip_ipi
- 第 iii 个位置选择 XXX 与前面的 OOO 断开,期望长度为 000,概率为 1−pi1-p_i1−pi
而对于贡献来说,我们只需要统计一下每次增加的就可以了
代码:
// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<unordered_map>
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
template<typename T>
inline void read(T &x)
{T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f;
}
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
const int inf=0x3f3f3f3f;
const int N=1e6+100;
char s[N];
int main()
{#ifndef ONLINE_JUDGE
// freopen("data.in.txt","r",stdin);
// freopen("data.out.txt","w",stdout);
#endif
// ios::sync_with_stdio(false);int n;read(n);double cur=0,ans=0;for(int i=1;i<=n;i++){double p;cin>>p;ans+=(cur*2+1)*p;//到了第i-1个位置的期望长度为cur,如果当前位置为O的话贡献会增加2*cur+1cur=(cur+1)*p+0*(1-p);//计算到了当前位置时的期望长度}printf("%.10f\n",ans);return 0;
}
CodeForces - 236D Let‘s Play Osu!(概率dp)相关推荐
- Codeforces 678E. Another Sith Tournament(概率DP,状压)
Codeforces 678E. Another Sith Tournament 题意: n(n<=18)个人打擂台赛,给定任意两人对决的胜负概率,比赛规则:可指定一人作为最开始的擂主,每次可指 ...
- Codeforces 148D:Bag of mice 概率DP
Bag of mice 题目链接: http://www.codeforces.com/problemset/problem/148/D 题意: 公主和龙在玩抓老鼠的游戏,在一个包里有一些白色老鼠和一 ...
- CodeForces 1139D Steps to One(概率dp 容斥/莫比乌斯反演)
题目链接https://codeforces.com/contest/1139/problem/D 题意:给定一个m,每次在1-m中随机取一个数放到容器中,当容器的gcd为1时停止,求期望步数,用分数 ...
- Codeforces 167B Wizards and Huge Prize(概率dp)
题意: n个人,开始有一个容量为k得背包,击败一个人背包可以获得一定容量或得到一个财富(放入背包内),给出击败每个人的概率,求至少击败l个人,且背包容量大于获得的总财富值的概率 分析: 状态好确定,d ...
- BZOJ4318: OSU! (概率DP)
题意:一个串 给出每个字符为1的可能性 否则为0 一段连续的1能获得长度的立方的收益 问总收益的期望 题解:设x_i为到第i位时连续的1的期望长度 由i-1递推来的贡献 如果这一位是0没有贡献 如果是 ...
- Codeforces 148D. Bag of mice(概率dp)
Codeforces 148D. Bag of mice(概率dp) Description The dragon and the princess are arguing about what to ...
- 【CodeForces - 518D】Ilya and Escalator(概率dp,数学期望)
题干: Ilya got tired of sports programming, left university and got a job in the subway. He was given ...
- 【原创】概率DP总结 by kuangbin
概率DP主要用于求解期望.概率等题目. 转移方程有时候比较灵活. 一般求概率是正推,求期望是逆推.通过题目可以体会到这点. 首先先推荐几篇参考的论文: <信息学竞赛中概率问题求解初探> & ...
- 动态规划 —— 概率 DP 与期望 DP
[概述] 由于概率和期望具有线性性质,使得可以在概率和期望之间建立一定的递推关系,这样就可以通过动态规划来解决一些概率问题,例如概率和期望的最值问题就常常使用概率 DP.期望 DP 来解决. 与其他的 ...
最新文章
- android 调用百度sdk点位当前城市
- 【Codeforces】1104C Grid game (变异的俄罗斯方块)
- 深入浅出统计学 第六章 排列与组合
- win10:JDK12.0.1环境变量配置
- IDEA如何设置鼠标滚轮调整字体大小
- Spring Boot Admin的使用
- 几何画板可以这样画虚线
- C++ STL中set底层实现方式
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]43 为AES 对抗侧信道攻击的防御
- 什么是代码调试(debugging)?进行代码调试的基本方法有哪些?
- ajax常见的status状态码
- Windows2008R2部署SharePoint Server 2013(2)---安装篇
- 动脑2017android_2017年最佳Android库
- java做一个简单的银行账户演示程序_JAVA初学(七):银行账户演示程序
- java sdk怎么配置_Java SDK环境配置教程
- Javashop B2B2C 系统之社区团购商城
- 三角形求高公式计算机,直角三角形求高公式 直角三角形怎么求高
- html网页头部图片,网页头图设计技巧
- 软件是计算机所需要的程序,软件是指电脑运行所需要的各种程序及其有关资料.doc...
- IntelCPU后缀含义