几周前挖的期望坑233
填坑2333
用f[i]表示前i位的期望得分,l[i]表示当前位往前数 连续1的期望长度。
如果第i位为1的概率为p[i],f[i] = f[i-1] + ( l[i-1] * 2 + 1 ) * p[i]
……反正…第i位如果是1,那么f[i] 比起 f[i-1] 多出来的就是 l[i]^2 - l[i-1]^2 的分数…………
意会一下啦QAQ
反正期望的转移……就是一个……差分一样的东西QAQQQ
#include<bits/stdc++.h>
#define MAXN 300005
using namespace std; int n;
char s[MAXN];
long double f[MAXN] , l[MAXN];
int main(){
scanf("%d%s",&n,s+1);
for(int i=1;i<=n;++i){
if(s[i]=='x'){
l[i] = 0;
f[i] = f[i-1];
continue;
}
if(s[i]=='o'){
l[i] = l[i-1] + 1;
f[i] = f[i-1] + 2 * l[i-1] + 1;
continue;
}
l[i] = (l[i-1] + 1) * 0.5;
f[i] = f[i-1] + ( 2 * l[i-1] + 1 ) * 0.5;
}
printf("%.4Lf",f[n]);
return 0;
}