zoukankan      html  css  js  c++  java
  • 【概率DP】BZOJ4318-OSU!

    【题目大意】

    一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1个长度为n的01串。在这个串中连续的 X个1可以贡献X^3 的分数,这x个1不能被其他连续的1所包含(也就是极长的一串1,具体见样例解释) 
    现在给出n,以及每个操作的成功率,请你输出期望分数,输出四舍五入后保留1位小数。 
     
    【思路】
    http://blog.csdn.net/popoqqq/article/details/49512533
    假如这个01串使确定的,考虑每新增一个位置,如果这个位置是0 ,则贡献为0 ,否则贡献为(x+1)3x3=3x2+3x+1 ,其中x 为加入之前最长的全1后缀的长度
    现在这个问题变成了期望问题,那么我们只需要维护一个x 的期望和x2 的期望即可。注意平方的期望不等于期望的平方。
    *自己的补充:关于概率运算的本质:
    为什么l1[cur]=(l1[1-cur]+1)*a1呢?其实这个式子应该是这样的:
    当前有a1的概率能够击中,产生的期望后缀长度(l1[1-cur]+1)*a1①
    当前有(1-a1)的概率不能够击中,产生的期望后缀长度0*(1-a1)②
    ①+②→l1[cur]=(l1[1-cur]+1)*a1
    f则是一般的递推加法,当前这次击中的概率不会影响f[i-1],而当前概率影响的因素只有期望分值得增加量
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cstdlib>
     5 #include<algorithm>
     6 using namespace std;
     7 double l1[2],l2[2],f[2];
     8 int n; 
     9  
    10 int main()
    11 {
    12     scanf("%d",&n);
    13     int cur=0; 
    14     for (int i=1;i<=n;i++,cur=1-cur)
    15     {
    16         double a1;
    17         scanf("%lf",&a1);
    18         l1[cur]=(l1[1-cur]+1)*a1;
    19         l2[cur]=(l2[1-cur]+2*l1[1-cur]+1)*a1;
    20         f[cur]=f[1-cur]+(3*l2[1-cur]+3*l1[1-cur]+1)*a1;
    21     }
    22     printf("%.1lf
    ",f[1-cur]);
    23     return 0;
    24 }
  • 相关阅读:
    文件
    drf序列化组件
    drf入门规范
    单例模式
    初识drf
    restful规范
    虚拟环境使用
    vue基础(三)
    vue基础(二)
    作业
  • 原文地址:https://www.cnblogs.com/iiyiyi/p/5645048.html
Copyright © 2011-2022 走看看