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

题意:

在这里插入图片描述

解法:

将 题 目 给 的 字 符 串 看 作 是 01 序 列 , 成 功 为 1 失 败 为 0. 设 x 当 前 操 作 进 行 连 续 1 的 个 数 . ( x + 1 ) 2 − x 2 = x 2 + 2 x + 1 − x 2 = 2 x + 1 即 每 新 增 一 个 1 , 那 么 分 数 会 增 加 2 x + 1. 令 c n t [ i ] 表 示 前 i 个 字 符 , x 的 期 望 值 , 那 么 c n t [ i ] = ( c n t [ i − 1 ] + 1 ) ∗ p , 其 中 p 为 第 i 个 字 符 为 1 的 概 率 . 令 d [ i ] 表 前 i 个 字 符 , 得 分 的 期 望 值 , 那 么 d [ i ] = d [ i − 1 ] + ( 2 ∗ c n t [ i − 1 ] + 1 ) ∗ p , 其 中 p 为 第 i 个 字 符 为 1 的 概 率 . 递 推 出 d [ n ] 即 可 . 将题目给的字符串看作是01序列,成功为1失败为0.\\ 设x当前操作进行连续1的个数.\\ (x+1)^2-x^2\\ =x^2+2x+1-x^2\\ =2x+1\\ 即每新增一个1,那么分数会增加2x+1.\\ 令cnt[i]表示前i个字符,x的期望值,\\ 那么cnt[i]=(cnt[i-1]+1)*p,其中p为第i个字符为1的概率.\\ 令d[i]表前i个字符,得分的期望值,\\ 那么d[i]=d[i-1]+(2*cnt[i-1]+1)*p,其中p为第i个字符为1的概率.\\ 递推出d[n]即可. 01,10.x1.(x+1)2x2=x2+2x+1x2=2x+11,2x+1.cnt[i]i,x,cnt[i]=(cnt[i1]+1)p,pi1.d[i]i,,d[i]=d[i1]+(2cnt[i1]+1)p,pi1.d[n].

code:

#include <bits/stdc++.h>
using namespace std;
const int maxm=3e5+5;
char s[maxm];
double cnt[maxm];
double d[maxm];
int n;
signed main(){
    
    
    cin>>n;
    cin>>(s+1);
    for(int i=1;i<=n;i++){
    
    
        double p=1;
        if(s[i]=='o')p=1;
        else if(s[i]=='x')p=0;
        else if(s[i]=='?')p=0.5;
        cnt[i]=(cnt[i-1]+1)*p;
        d[i]=d[i-1]+(2*cnt[i-1]+1)*p;
    }
    printf("%.4f\n",d[n]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44178736/article/details/112790572