题目链接:点击查看

题目大意:给出一个长度为 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 个位置时只有两种情况:

  1. 第 iii 个位置选择 OOO 与前面的 OOO 连起来,期望长度变为 len+1len+1len+1,概率为 pip_ipi​
  2. 第 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)相关推荐

  1. Codeforces 678E. Another Sith Tournament(概率DP,状压)

    Codeforces 678E. Another Sith Tournament 题意: n(n<=18)个人打擂台赛,给定任意两人对决的胜负概率,比赛规则:可指定一人作为最开始的擂主,每次可指 ...

  2. Codeforces 148D:Bag of mice 概率DP

    Bag of mice 题目链接: http://www.codeforces.com/problemset/problem/148/D 题意: 公主和龙在玩抓老鼠的游戏,在一个包里有一些白色老鼠和一 ...

  3. CodeForces 1139D Steps to One(概率dp 容斥/莫比乌斯反演)

    题目链接https://codeforces.com/contest/1139/problem/D 题意:给定一个m,每次在1-m中随机取一个数放到容器中,当容器的gcd为1时停止,求期望步数,用分数 ...

  4. Codeforces 167B Wizards and Huge Prize(概率dp)

    题意: n个人,开始有一个容量为k得背包,击败一个人背包可以获得一定容量或得到一个财富(放入背包内),给出击败每个人的概率,求至少击败l个人,且背包容量大于获得的总财富值的概率 分析: 状态好确定,d ...

  5. BZOJ4318: OSU! (概率DP)

    题意:一个串 给出每个字符为1的可能性 否则为0 一段连续的1能获得长度的立方的收益 问总收益的期望 题解:设x_i为到第i位时连续的1的期望长度 由i-1递推来的贡献 如果这一位是0没有贡献 如果是 ...

  6. Codeforces 148D. Bag of mice(概率dp)

    Codeforces 148D. Bag of mice(概率dp) Description The dragon and the princess are arguing about what to ...

  7. 【CodeForces - 518D】Ilya and Escalator(概率dp,数学期望)

    题干: Ilya got tired of sports programming, left university and got a job in the subway. He was given ...

  8. 【原创】概率DP总结 by kuangbin

    概率DP主要用于求解期望.概率等题目. 转移方程有时候比较灵活. 一般求概率是正推,求期望是逆推.通过题目可以体会到这点. 首先先推荐几篇参考的论文: <信息学竞赛中概率问题求解初探> & ...

  9. 动态规划 —— 概率 DP 与期望 DP

    [概述] 由于概率和期望具有线性性质,使得可以在概率和期望之间建立一定的递推关系,这样就可以通过动态规划来解决一些概率问题,例如概率和期望的最值问题就常常使用概率 DP.期望 DP 来解决. 与其他的 ...

最新文章

  1. android 调用百度sdk点位当前城市
  2. 【Codeforces】1104C Grid game (变异的俄罗斯方块)
  3. 深入浅出统计学 第六章 排列与组合
  4. win10:JDK12.0.1环境变量配置
  5. IDEA如何设置鼠标滚轮调整字体大小
  6. Spring Boot Admin的使用
  7. 几何画板可以这样画虚线
  8. C++ STL中set底层实现方式
  9. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]43 为AES 对抗侧信道攻击的防御
  10. 什么是代码调试(debugging)?进行代码调试的基本方法有哪些?
  11. ajax常见的status状态码
  12. Windows2008R2部署SharePoint Server 2013(2)---安装篇
  13. 动脑2017android_2017年最佳Android库
  14. java做一个简单的银行账户演示程序_JAVA初学(七):银行账户演示程序
  15. java sdk怎么配置_Java SDK环境配置教程
  16. Javashop B2B2C 系统之社区团购商城
  17. 三角形求高公式计算机,直角三角形求高公式 直角三角形怎么求高
  18. html网页头部图片,网页头图设计技巧
  19. 软件是计算机所需要的程序,软件是指电脑运行所需要的各种程序及其有关资料.doc...
  20. IntelCPU后缀含义

热门文章

  1. 操作索引库-创建索引库
  2. SpringSecurity权限控制之异常处理方式三
  3. ConcurrentHashMap的源码分析-tabAt
  4. stateOffset
  5. 会话创建过程-创建Transaction
  6. Redis中的数据迁移
  7. 数据库-聚合函数-count-sum
  8. Stream流中的常用方法_forEach
  9. java 调用 dll 乱码_java调用c++ dll出现中文乱码
  10. python之datetime模块