BZOJ 4318: OSU! 期望概率dp && 【BZOJ3450】【Tyvj1952】Easy 概率DP

这两道题是一样的......

我就说一下较难的那个 OSU!:

这道15行的水题我竟然做了两节课......

若是f[i][0]=(1-p)*f[i-1][0]+(1-p)*f[i-1][1],f[i][1]=p*(f[i-1][0]+1.0)+p*(f[i-1][1]+OOXX);

我们合并一下f[i]=p*1.0+p*OOXX=p*OX;

OX:就是期望x^3的差,也就是(x+1)^3=x^3+3*x^2+3*x+1.0,中的3*x^2+3*x+1.0,这样我们要维护x^2以及x注意这里的x^2和x是指结尾的长度x

#include<cstdio>
double f,p,X2,X1;
int n;
int main()
{
   scanf("%d",&n);
   for(int i=1;i<=n;i++)
   {
     scanf("%lf",&p);
     f+=p*(3.0*X2+3.0*X1+1.0);
     X2=p*(X2+2.0*X1+1.0);
     X1=p*(X1+1.0);
   }
   printf("%.1lf",f);
}

 下面给一下Easy的代码

#include<cstdio>
#include<cstring>
using namespace std;
char s[300010];
double ans,X,now;
int len;
int main()
{
   scanf("%d%s",&len,s);
   for(int i=0;i<len;i++)
   {
      if(s[i]=='?')now=0.5;
      else if(s[i]=='o')now=1.0;
      else now=0.0;
      ans+=now*(2.0*X+1.0);
      X=now*(X+1.0);
   }
   printf("%.4lf",ans);
   return 0;
}

 

posted @ 2017-07-15 09:52  TS_Hugh  阅读(163)  评论(0编辑  收藏  举报