朴素 多项式期望求解

来源:互联网 发布:李银桥和权延赤 知乎 编辑:程序博客网 时间:2024/06/06 01:51




由期望的线性性

可以一个个加起来

所以x^3 x^2 K分开考虑

x^2 x^3详见BZOJ 4318: OSU! 期望dp

我们来讨论一下K

每次的状态可以看做是一个01串

对于每次K的变化一定是在0结束或1结束

所以每次都可以抵消掉

不过当然有例外

当第一个和最后一个相同,就会无法抵消

所以只需要把这种情况加上就行了


#include<bits/stdc++.h> using namespace std;typedef long long ll;inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}    return x*f;}int N;double K,p[1000010],l1[1000010],l2[1000010],n1[1000010],f[1000010][2],ans; int main(){    register int i,j;    scanf("%d%lf",&N,&K);    for(int i=1;i<=N;i++)    {        scanf("%lf",&p[i]);        l1[i]=(l1[i-1]+1)*p[i];        n1[i]=(n1[i-1]+1)*(1-p[i]);        l2[i]=(l2[i-1]+2*l1[i-1]+1)*p[i];        f[i][1]=f[i-1][1]+(3*l2[i-1]+3*l1[i-1]+1)*p[i];        f[i][2]=f[i-1][2]-(2*n1[i-1]+1)*(1-p[i]);    }    ans+=f[N][1]+f[N][2];    ans=ans+p[1]*p[N]*K-(1-p[1])*(1-p[N])*K;    printf("%lf\n",ans);    return 0;} 

原创粉丝点击