• CF 235B Let's play Osu! 概率DP 好题


    题意:

    给n个位置,给出1-n上每个位置出现O的概率pi,记分规则如下,连续的x个O记为x^2分,求和,如 XXOOOXOXOOXX得分为

    求得分的期望

     

     

    思考一下,我们能比较容易地得出O(n^2)的方法

    令dp[i]为前i的得分期望

    那么

    显然这题

    考虑一下变换记分的方式

    我们有

    那么记分方式就变为

    一段连续的O,有多少对O×2+O的个数

    一对O可以贡献2分

     

    现在得分来源变为两个地方

    一对O(2分),和单个O(1分)

     

    我们知道

    期望=概率×收益

    我们找到每个对O的概率×2

    再找到单个O×出现概率

    求和即是期望得分

     

    对于某一个点i

    有(1,i) (2,i) (3,i) (4,i)...(i-1,i)这些对O,每个概率即是从左到右连乘,比如

    令这些概率和为dp[i],即

    这样我们有递推关系

    对i+1点来说,

     

    dp求和即是所有对O出现的概率之和×2

    +

    单个O出现的概率×1

    求得的即是期望分数

     

    记住:

    1.期望=概率*收益

    2.利用C(n,2)+n=n^2等变换实现记分变换

     1 #include<cstdio>
     2 
     3 const int maxn=1e5+10;
     4 
     5 double p[maxn];
     6 double dp[maxn];
     7 
     8 int main()
     9 {
    10     int n;
    11     scanf("%d",&n);
    12     for(int i=1;i<=n;i++)
    13     {
    14         scanf("%lf",&p[i]);
    15     }
    16     dp[1]=0.0;
    17     double ans=0.0;
    18     for(int i=2;i<=n;i++)
    19     {
    20         dp[i]=dp[i-1]*p[i]+p[i-1]*p[i];
    21         ans+=2.0*dp[i];
    22     }
    23     for(int i=1;i<=n;i++)
    24         ans+=p[i];
    25     printf("%.15f
    ",ans);
    26 
    27     return 0;
    28 }
    View Code
  • 相关阅读:
    MongoDB的基础连接
    Pygame的图像移动
    Pygame的KEYDOWN和KEYUP
    Pygame的程序开始
    Tkinter的MessageBox组件
    流程控制语句-if...else语句
    流程控制语句-if判断
    分享数组概念、创建、赋值、长度与使用
    js入门与实战课前准备和编辑工具介绍
    JavaScript进阶篇-JS基础语法
  • 原文地址:https://www.cnblogs.com/-maybe/p/4686968.html
Copyright © 2020-2023  润新知