BZOJ 4318: OSU!
我们考虑
$E(\xi + \eta) = E\xi + E\eta$
$E(\xi + \eta)^2 = E\xi^2 + 2 \cdot E\xi \cdot E\eta + E\eta^2$
$E(\xi + \eta)^3 = E\xi^3 + 3 \cdot E\xi \cdot E\eta ^2 + 3 \cdot E\xi^2 \cdot E\eta + 3$
我们令
$f[i] 表示以i为结尾并且最后一位为1的数学期望$
$g[i] 表示 平方$
$h[i] 表示立方$
再考虑 对于前面$i位的结果,我们都已经知道,当再添加一位的时候$
$如果在当前位添加0,那么期望 = 权值 \cdot 概率 此时的概率为 1 - p[i] 权值就是 h[i - 1]$
$那如果添加1,依据上述公式递推即可$
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define N 100010 5 int n; 6 double p[N], f[N], g[N], h[N]; 7 8 void Run() 9 { 10 while (scanf("%d", &n) != EOF) 11 { 12 for (int i = 1; i <= n; ++i) scanf("%lf", p + i); 13 for (int i = 1; i <= n; ++i) 14 { 15 f[i] = p[i] * (f[i - 1] + 1); 16 g[i] = p[i] * (g[i - 1] + 2 * f[i - 1] + 1); 17 h[i] = p[i] * (h[i - 1] + 3 * g[i - 1] + 3 * f[i - 1] + 1) + (1 - p[i]) * h[i - 1]; 18 } 19 printf("%.1f\n", h[n]); 20 } 21 } 22 23 int main() 24 { 25 #ifdef LOCAL 26 freopen("Test.in", "r", stdin); 27 #endif 28 29 Run(); 30 return 0; 31 }