题意:给出一个ox序列,每一段连续的o的得分是o的数量的平方,现在给出每一个位置为o的概率,问得分的期望。
思路:首先这道题要将每一个位置分开来看,计算他们对于总体期望的贡献才可以,如果暴力dp的话O(
n2
)的复杂度时间无法承受。
考虑一段长度为n的连续序列o…o,总共的得分是n2,可以看成是由每个o贡献1分以及任意一对o(可以不相邻,于是共有
C2n
组)贡献2分组成的,这个性质反过来证明很容易,但是想了好久没想懂是怎么来的。。。。。官方题解里也说的不清楚
个人观点是可以把
n2
写成
(1+...+1)n
然后分解这个式子,所以每个位置的贡献就是自己本身和与任意其他位置的组合数量。
知道了这个性质以后,后面就比较好做了,假设当前位置为j,那么j对总体的贡献就是j为1的贡献加上j与其他所有位置配对的贡献,这一步可以用dp来做,所以最后的答案就可以得到了。
#include <bits/stdc++.h>
#define eps 1e-6
#define LL long long
#define pii pair<int, int>
#define pb push_back
#define mp make_pair
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
const int MAXN = 5000000;
//const int MOD = 1e9+7;
//const int INF = 0x3f3f3f3f;
int n;
double dp[MAXN], p[MAXN], ans;
int main()
{
//freopen("input.txt", "r", stdin);
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%lf", &p[i]);
for (int i = 1; i <= n; i++) {
dp[i] = (dp[i-1]+p[i-1])*p[i];
ans += dp[i]*2 + p[i];
}
printf("%.9f", ans);
return 0;
}