BZOJ4318: OSU!

【传送门:BZOJ4318


简要题意:

  给出n个位置,每个位置可以有a[i]的概率会变成1,1-a[i]的概率为0,最后会变成一个长度为n的01串,而每个01串中,连续x个1会带来x3的价值(这x个1不能被其他连续的1所覆盖),求出期望分数


题解:

  期望DP

  太神了。。

  首先假设当前有一个串,它的后缀有x个1,那么在它的下一个位置出现1的价值就是(x+1)3-x3=3x2+3x+1,期望就是a[i]*(3x2+3x+1)

  而我们可以得到x和x2的期望

  那么这道题就可以做了


参考代码:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
double x[110000],x2[110000],a[110000],f[110000];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%lf",&a[i]);
        x[i]=(x[i-1]+1)*a[i];
        x2[i]=(x2[i-1]+2*x[i-1]+1)*a[i];
        f[i]=f[i-1]+(3*x2[i-1]+3*x[i-1]+1)*a[i];
    }
    printf("%.1lf
",f[n]);
    return 0;
}

 

原文地址:https://www.cnblogs.com/Never-mind/p/8657499.html