LuoguP1654 OSU! 概率与期望

感觉数学期望这里始终都没太学明白.
期望在任何时候都具有线性性,即 $E(a+b)=E(a)+E(b)$,这个式子任何时候都成立.
先考虑求 $x$,$x^2$.
令 $x1[i]$ 表示 $i$ 为 $1$ 向前的极长 $1$ 的期望长度,$x2[i],x3[i]$ 为 $x^2,x^3$ 的期望.
那么考虑从 $i-1$ 那里转移过来,就是 $E(j+1)=E(j)+E(1)=E(j)+1$.
概率是 $q[i]$,所以 $x1[i]=(x1[i-1]+1) \times q[i]$.
$E((x+1)^2)=E(x^2)+E(2x)+1=E(x^2)+2E(x)+1$.
$x2[i]=(x2[i-1]+2x1[i-1]+1) \times q[i]$,$x3[i]$ 同理.
那么枚举完以 $i$ 结尾且 $i$ 为 $1$ 的 $x3[i]$ 后 $i$ 对后面有贡献当且仅当后一位是 $0$.
乘上这个概率就好了,最后把所有位置的贡献加和就是总贡献了.

#include   
#include 
#include    
#define N  100009  
#define ll long long 
#define setIO(s) freopen(s".in","r",stdin) 
using namespace std;  
double x3[N],x1[N],x2[N],ans[N];  
int main() { 
    // setIO("input");  
    int n;      
    scanf("%d",&n);          
    double fin=0.0; 
    for(int i=1;i<=n;++i) { 
        double q;   
        scanf("%lf",&q);    
        x1[i]=(x1[i-1]+1.0)*q;  
        x2[i]=(x2[i-1]+2.0*x1[i-1]+1.0)*q;   
        x3[i]=(x3[i-1]+3.0*x2[i-1]+3.0*x1[i-1]+1.0)*q; 
        fin+=x3[i-1]*(1.0-q);  
    }
    fin+=x3[n];  
    printf("%.1f\n",fin); 
    return 0; 
}

  

你可能感兴趣的:(LuoguP1654 OSU! 概率与期望)