P1365 WJMZBMR打osu! / Easy 题解(期望dp)

题目链接

题目思路

显然每次转移都需要知道前面连续长度的期望

所以使用两个数组,一个记录答案,一个记录连续长度期望即可

代码

#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;
}

posted @ 2021-11-12 15:21  hunxuewangzi  阅读(23)  评论(0编辑  收藏  举报