BZOJ4318 OSU!(动态规划+概率期望)

  设f[i][0/1]为考虑前i位,第i位为0/1时的期望得分(乘以是0/1的概率)。暴力转移显然。前缀和优化即可。

  但是这个前缀和精度无法承受,动不动就nan。

  考虑增加一位的贡献。若之前后缀1的个数为x,则增加一个1的贡献为(x+1)3-x3=3x2+3x+1。因此记录后缀1的个数期望、后缀1的个数平方的期望即可。

#include<iostream> 
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
    int x=0,f=1;char c=getchar();
    while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
    while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
    return x*f;
}
#define N 100010
int n;
double p[N],e,e2,ans;
int main()
{
#ifndef ONLINE_JUDGE
    freopen("bzoj4318.in","r",stdin);
    freopen("bzoj4318.out","w",stdout);
    const char LL[]="%I64d\n";
#else
    const char LL[]="%lld\n";
#endif
    n=read();
    for (int i=1;i<=n;i++) scanf("%lf",&p[i]);
    for (int i=1;i<=n;i++)
    {
        ans+=(3*e2+3*e+1)*p[i];
        e2=(e2+2*e+1)*p[i];
        e=(e+1)*p[i];
    }
    printf("%.1f",ans);
    return 0;
}

 

posted @ 2018-10-26 19:43  Gloid  阅读(257)  评论(0编辑  收藏  举报