codeforces 235B Let's Play Osu! 概率dp

本文介绍了一个概率问题的解决思路,给定一系列独立事件的发生概率,求解这些事件中连续发生事件的价值期望。通过数学推导将问题转化为求解连续段数及事件发生的总数,最终通过动态规划的方法求得期望值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:给定n表示有n个格子,下面每个格子为O的概率是多少。对于一段连续 x 个O的价值就是 x^2 ;求获得的价值的期望是多少。

思路:n^2=n×(n-1)+n,设ai为第i段连续O的长度,∑ai^2 = ∑[ ai+ ai*(ai-1) ] = ∑ ai*(ai-1) + ∑ai = ∑ C(ai, 2)*2 + ∑ai,那么问题可以转

化为求长度大于1的连续段数*2+O的个数的总期望。 ∑ai我们可以理解为O的总个数,所以它的期望为pi; C(ai, 2)*2我们可以认

为是连续ai个O中任意选两个点,两个点形成的段必然长度大于1,所以 ∑ C(ai, 2)*2可以理解为长度大于1的连续段数*2。我们设dp[i]

为以i结尾的连续O的段数。那么由期望公式,dp[i]=p[i]×(dp[i - 1]+1)+(1-p[i])*0=p[i]×(dp[i - 1]+1),且dp[i]-p[i]×1才表示以i结尾的长度大

于1的连续O的段数,所以ans+=2×(dp[i] - p[i]×1)。详见代码:

/*********************************************************
  file name: codeforces235B.cpp
  author : kereo
  create time:  2015年02月02日 星期一 13时02分36秒
*********************************************************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<stack>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
const int sigma_size=26;
const int N=100+50;
const int MAXN=100000+50;
const int inf=0x3fffffff;
const double eps=1e-8;
const int mod=100000000+7;
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define PII pair<int, int>
#define mk(x,y) make_pair((x),(y))
int n;
double dp[MAXN],p[MAXN];
int main(){
    while(~scanf("%d",&n)){
        double ans=0;
        for(int i=1;i<=n;i++){
            scanf("%lf",&p[i]);
            ans+=p[i];
        }
        dp[0]=0;
        for(int i=1;i<=n;i++){
            dp[i]=p[i]*(1+dp[i-1]);
            ans+=2*(dp[i]-1*p[i]);
        }
        printf("%.15f\n",ans);
    }
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值