BZOJ 3450: Tyvj1952 Easy [DP 概率]
题意:$ox?$组成的序列,$?$等概率为$o\ or\ x$,得分为连续的$o$的长度的平方和,求期望得分
一开始没想出来,原因在于不知道如何记录长度
其实我们同时求得分和长度的期望就好了
$(x+1)^2=x^2+2x+1$
其实就是维护了$x$的期望和$x^2$的期望
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; typedef long long ll; const int N=3e5+5; inline int read(){ char c=getchar();int x=0,f=1; while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } int n; char s[N]; double f[N],d[N]; int main(){ freopen("in","r",stdin); n=read();scanf("%s",s+1); for(int i=1;i<=n;i++){ if(s[i]=='o') d[i]=d[i-1]+1,f[i]=f[i-1]+2*d[i]-1; else if(s[i]=='x') d[i]=0,f[i]=f[i-1]; else d[i]=(d[i-1]+1)*0.5,f[i]=f[i-1]+(2*d[i-1]+1)*0.5; } printf("%.4lf",f[n]); }
Copyright:http://www.cnblogs.com/candy99/