Description
Input
Output
Sample Input
0.5
0.5
0.5
Sample Output
HINT
题目大意 已知一个01串的第i位为1的概率为( p_{i} ),出现x个连续的1,则对分数有( x^{3} )的贡献(不能重复进行贡献,例如11的分数为8,而不是10),问期望的分数。
根据dp的常用套路,会考虑设( f[i][j] )表示考虑到第i位,末尾有j个1的期望分数。但是这里是求期望,期望是有线性的,所以直接考虑期望增加的分数。
故用( f[i] )表示考虑到第i位的期望。
1.如果第i位为0,则什么贡献都不会产生
2.如果第i位为1,然后考虑增加的贡献,设( x )表示末尾有x个1,则有( left(x + 1 ight )^{3}-x^{3} ),化简得到( 3x^{2} + 3x + 1 )
设( p )表示( p_{i} ),考虑维护期望的x的值,这个很好想,直接( E_{x}' = pleft(E_{x} + 1 ight ) )。
关键是如何维护( x^{2} )(科普,正确的对平方的期望的理解是 长度的平方 的期望,显然它不等于 期望的长度 的平方)
考虑它的定义,设( P_{i} )表示上一位结尾有i个1的概率。根据期望的定义我们有:
( E_{x^{2}} = sum_{k = 0}^{i - 1}k^{2}P_{k}=0^{2}P_{0}+1^{2}P_{1}+cdots +left(i - 1 ight )^{2}P_{i-1} )
现在考虑第i位为1,于是得到了下面这个式子:
( E_{x^{2}}' = pleft[0 + sum_{k = 0}^{i - 1}left ( k+1 ight )^{2}P_{k} ight] )
用完全平方公式展开其中的平方系数:
( E_{x^{2}}' = pleft[0 + sum_{k = 0}^{i - 1}left ( k^{2} + 2k +1 ight )P_{k} ight] )
继续化简得到:
( E_{x^{2}}' = p left( sum_{k = 0}^{i - 1} k^{2}P_{k} + 2sum_{k = 0}^{i - 1}kP_{k} + sum_{k=0}^{i-1}P_{k} ight) )
对比( E_{x} )的定义式( E_{x} = sum_{k = 0}^{i - 1}kP_{k} )和( E_{x^{2}} )的定义式,然后根据一下有关(P_{i})的性质可以得到:
( E_{x^{2}}'=pleft (E_{x^{2}} + 2E_{x} + 1 ight ) )
然后一切就简单了。
由于( f[i] )等于( f[i - 1] )加一坨乱七八糟的东西,答案在( f[n] ),所以这题根本不用数组qaq。
Code
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef bool boolean; 4 #define ll long long 5 6 int n; 7 double p, x = 0.0, x2 = 0.0, E = 0.0; 8 9 inline void solve() { 10 scanf("%d", &n); 11 for(int i = 1; i <= n; i++) { 12 scanf("%lf", &p); 13 E += (3 * (x2 + x) + 1) * p; 14 x2 = (x2 + 2 * x + 1) * p; 15 x = (x + 1) * p; 16 // cerr << E << " " << x2 << " " << x << endl; 17 } 18 printf("%.1lf", E); 19 } 20 21 int main() { 22 solve(); 23 return 0; 24 }