洛谷 P1654 OSU! 概率DP
首先说明一点:平方的期望 不等于 期望的平方,三次方也一样
设 \(f[i]\) 为只考虑前 \(i\) 个时的答案
若当前格子为 \(0\) ,不会造成额外贡献。
若当前格子为 \(1\) ,概率为 \(p[i]\) ,造成的贡献为 \(E(len_i^3)=E((len_{i-1}+1)^3)=E(len_{i-1}^3)+E(3len_{i-1}^2)+E(3len_{i-1})+E(1)\)
因为 \(E(len_{i-1}^3)\) 在 \(i-1\) 已经统计过了,所以额外造成的贡献为 \(E(3len_{i-1}^2)+E(3len_{i-1})+E(1)\)
\(DP\) 一下就行了
#include<iostream>
#include<cstdio>
using namespace std;
int n;
const int N = 100010;
double a[N], b[N], f[N], p[N];
int main()
{
cin >> n;
for (int i = 1; i <= n; ++i)scanf("%lf", &p[i]);
for (int i = 1; i <= n; ++i)
{
a[i] = (a[i - 1] + 1) * p[i];
b[i] = (b[i - 1] + 2 * a[i - 1] + 1) * p[i];
f[i] = f[i - 1] + (3 * b[i - 1] + 3 * a[i - 1] + 1) * p[i];
}
printf("%0.1f", f[n]);
return 0;
}