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 <cstdio> #include <cstring> #include <algorithm> #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; }