洛谷题单指南-概率与统计-P1654 OSU!

原题链接:https://www.luogu.com.cn/problem/P1654

题意解读:n个01串,如果出现x个连续1,得分加x3,求总分数的期望。

解题思路:

总分数的期望是所有可能的连续1串分数的和,也是所有位置为最后一个1串末尾的分数*概率之和,直接求不容易,但随着串的长度增加,存在递推关系。

设x是部分串后缀都是1的长度,当下一位也是1,总得分增加值为(x+1)3-x3 = 3x2+3x+1

设E(i)表示长度i的串的得分期望,第i为是1的概率为P(i)

那么有E(i) = E(i-1) + P(i) * (3x2+3x+1)

由于E(x2)!=E(x)2,x2必须理解为前i-1位后缀1长度平方的期望,x为前i-1为后缀1长度的期望

设L1(i)表示前i位后缀1长度的期望,L2(i)表示前i位后缀1长度平方的期望

则有:E(i) = E(i-1) + P(i) * (3*L2(i-1) + 3*L1(i-1) + 1)

L1(i) = P(i) * (L1(i-1) + 1) 

L2(i) = P(i) * (L2(i-1) + 2*L1(i-1) + 1),(由于E(x2)!=E(x)2,x2必须理解为前i-1位后缀1长度平方的期望)

再递推中计算即可。

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 100005;
double E[N], L1[N], L2[N], P[N];
int n;

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> P[i];

    for(int i = 1; i <= n; i++)
    {
        L1[i] = P[i] * (L1[i - 1] + 1);
        L2[i] = P[i] * (L2[i - 1] + 2 * L1[i - 1] + 1);
        E[i] = E[i - 1] + P[i] * (3 * L2[i - 1] + 3 * L1[i - 1] + 1);
    }
    printf("%.1f", E[n]);
    return 0;
}

 

posted @ 2025-12-31 18:17  hackerchef  阅读(19)  评论(0)    收藏  举报