这个题就是告诉你 要用期望来解决期望
这个题最直接的做法就是n^2dp了,但显然是炸的
如果要求 (1到n +1) 的 和 , 那就是n的枚举,但如果有平均数,就直接 n*个数 了
对于二次方,
对于三次方:
不仅是平均数和每个数是这个关系
期望和每种可能的取值也是这个关系
期望仅仅比平均数多了一个概率,所有可能概率加起来还是1、
所以对于1~i种可能的1串长度,我们可以求一个期望长度,来代替这i种可能的长度(由于对所有长度的操作都一样(都是乘当前点的概率),所以可以用一个期望来代替操作)
因为每插入一个1,对前面的所有1~i长度的1串都要乘概率
所以它就可以递推了
如果这个点是1 那 上一个的期望长度就要加1 概率为 这个点的概率
如果这个点是0 那 上一个点的期望长度就全变成0 ,这种情况就终止了,不会对答案造成贡献 ,不用往后转移了(这之后的都被考虑过了(下一个的1))
其实有了上一个点的期望长度,就可以套上面的三次方公式算这个点的答案了(没有x^3因为x^3作为上一个点的答案已经保存在f【i-1】里了)
次方没有可加性,所以需要拆开
码(与思维量成反比):
#include<iostream>
#include<cstdio>
using namespace std;
int i,n;
double f[100009],x,l[100009],ll[100009];
int main()
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%lf",&x);
l[i]=(l[i-1]+1)*x;
ll[i]=(ll[i-1]+2*l[i-1]+1)*x;
f[i]=f[i-1]+(3*ll[i-1]+3*l[i-1]+1)*x;
}
printf("%.1lf",f[n]);
}