题目链接
题目思路
显然每次转移都需要知道前面连续长度的期望
所以使用两个数组,一个记录答案,一个记录连续长度期望即可
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
#define fi first
#define se second
#define debug printf("aaaaaaaaaaa\n");
const int maxn=3e5+5,inf=0x3f3f3f3f,mod=51123987,mul=233;
const ll INF=0x3f3f3f3f3f3f3f3f;
const double eps=1e-7;
int n;
char s[maxn];
double dp[maxn][2];
int main(){
scanf("%d %s",&n,s+1);
for(int i=1;i<=n;i++){
if(s[i]=='o'){
dp[i][1]=dp[i-1][1]+2*dp[i-1][0]+1;
dp[i][0]=dp[i-1][0]+1;
}else if(s[i]=='x'){
dp[i][1]=dp[i-1][1];
dp[i][0]=0;
}else{
dp[i][1]=dp[i-1][1]+dp[i-1][0]+0.5;
dp[i][0]=(dp[i-1][0]+1)/2;
}
}
printf("%.4f\n",dp[n][1]);
return 0;
}