洛谷 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;
}
posted @ 2020-03-28 21:59  wljss  阅读(154)  评论(0编辑  收藏  举报