zoukankan      html  css  js  c++  java
  • 【bzoj4318】【OSU!】期望dp——维护多个期望值递推

    这里写图片描述
    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62369739

    Description
    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
    3
    0.5
    0.5
    0.5
    Sample Output
    6.0
    HINT
    【样例说明】
    000分数为0,001分数为1,010分数为1,100分数为1,101分数为2,110分数为8,011分数为8,111分数为27,总和为48,期望为48/8=6.0
    N<=100000

    当然,看到题的第一反应就是dp。为什么呢?通常如果题面的信息或所需答案的状态可以表示,而该状态又可以转化为相似的子状态,此时就可以考虑dp:如何表示其状态?怎样的状态表示可以方便递推?怎样的状态可以减少枚举复杂度?

    对于这道题,我想到了dp,但是却想不出如何转移,看了题解都有点理解不了,在此就整理一下思路。

    我们设f[i]表示前i个的期望答案。对于第i位,有0和1两种状态。如果为0,就直接加上f[i-1];如果为1,就算上这一位的贡献。整理下来就是:
    f[i]=f[i-1]*(1-p[i])+(f[i-1]+新的贡献)*p[i]=f[i-1]+新的贡献*p[i]
    然而我最开始想多了,设成了f[i][0/1]表示这一位是否成功的期望。然而发现这样的不好转移,因为这一位的0和1是有概率的,在对f[i]的定义上都难以说清。

    我为什么会想多呢?其实最开始思考新的一个1对答案的贡献的时候,已经推出了(x+1)^3-x^3=3*x^2+3*x+1。但是如何求得之前的x,我一直没有突破。其实这个x很明显是一个期望值,可以定义为 最靠后的连续为1的期望个数。x是可以递推求出的,x^2也是可以求出的(但是要注意期望的平方不是平方的期望)

    所以只需要递推出f,x^2,x就可以做了

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    const int N=100000+5;
    
    int n;
    double p[N],f[N],x1[N],x2[N];
    
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%lf",&p[i]);
        for(int i=1;i<=n;i++){
            x1[i]=(x1[i-1]+1)*p[i];
            x2[i]=(x2[i-1]+2*x1[i-1]+1)*p[i];
            f[i]=f[i-1]+(3*x2[i-1]+3*x1[i-1]+1)*p[i];
        }
        printf("%.1lf",f[n]);
        return 0;
    }

    总结:
    1、所设的dp状态的定义要清晰、方便转移
    2、dp不仅是从自己推到自己,有时还需要别的状态转移。如bzoj1426邮票 也是如此(我竟然没有写这道题的博客?虽然理解还不够清晰)

  • 相关阅读:
    动态代理:JDK动态代理和CGLIB代理的区别
    spring启动component-scan类扫描加载,以及@Resource,postConstruct等等注解的解析生效源码
    spring启动component-scan类扫描加载过程---源码分析
    spring源码分析之spring-core asm概述
    Spring组件扫描 <context:component-scan/>
    【OSGI】1.初识OSGI-到底什么是OSGI
    superrvisor application config ini
    doris 0.9.0版本docker镜像制作与使用
    Docker系列09:搭建Harbor本地镜像仓库
    Docker系列08:容器监控
  • 原文地址:https://www.cnblogs.com/LinnBlanc/p/7763128.html
Copyright © 2011-2022 走看看