題鏈:
http://www.joyoi.cn/problem/tyvj-1952
題解:
概率dp
(先做的BZOJ 4318: OSU![本人題解],然後就感覺這個題很簡單了)
令p[i]表示第i個位置為o的概率。
定義g[i]表示以i位置結尾形成1的期望長度
g[i]=p[i]*(g[i-1]+1)
在定義f[i]表示從1到i位置的期望得分,
分為i位置為o和為x兩種情況
f[i]=p[i]*(f[i-1]+2*g[i-1]+1)+(1-p)*f[i-1]
程式碼:
#include<bits/stdc++.h> #define MAXN 300005 using namespace std; double g[MAXN],f[MAXN]; char S[MAXN]; int N; int main(){ ios::sync_with_stdio(0); cin>>N>>(S+1); for(int i=1;i<=N;i++){ double p; switch(S[i]){ case 'o':p=1;break; case 'x':p=0;break; case '?':p=0.5;break; } g[i]=p*(g[i-1]+1); f[i]=p*(f[i-1]+2*g[i-1]+1)+(1-p)*f[i-1]; } cout<<fixed<<setprecision(4)<<f[N]<<endl; return 0; }