洛谷 P1654 题解
数学期望这一块不太好,每次考试都想不出期望的题,打几道练习题练练手。
题目简述
给一个长度为 n的 01串的每一位为 1的概率,一个串的分数为其中每一个长度为 x的全 1串的长度的立方和,即 x3,求期望分数。(每一个 1只会作为一个全 1串的一部分而只被算一次)
解题方法
考虑先从分数为 x来下手,设 fi表示前 i个数中第 i位为 1的长度的期望,则有 fi=(fi−1+1)×pi
考虑分数为 x2,设 gi表示前 i个数中第 i位为 1的长度的期望,则有 gi=(gi−1+2fi−1+1)×pi
设分数为 x3时, hi表示前 i个数中分数的期望,则有
hi=hi−1×(1−pi)+(hi−1+3gi−1+3fi−1+1)×pi
代码
/******************************* Author:galaxy yr LANG:C++ Created Time:2019年09月14日 星期六 19时45分47秒 *******************************/
#include<iostream>
#include<cstdio>
#include<iomanip>
using namespace std;
const int maxn=1e5+10;
double a[maxn],b[maxn],f[maxn],p[maxn];
int n;
int main()
{
//freopen("p1654.in","r",stdin);
//freopen("p1654.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)
cin>>p[i];
for(int i=1;i<=n;i++)
{
a[i]=(a[i-1]+1)*p[i];
b[i]=(b[i-1]+2*a[i-1]+1)*p[i];
f[i]=f[i-1]+(3*b[i-1]+3*a[i-1]+1)*p[i];
}
cout<<fixed<<setprecision(1)<<f[n]<<endl;
return 0;
}