题目
有 n n n次点击要做,成功了就是 o o o,失败了就是 x x x,分数是按 c o m b o combo combo计算的,连续 a a a个 c o m b o combo combo就有 a × a a\times a a×a分, c o m b o combo combo就是极大的连续 o o o。有些地方 o o o或者 x x x各有 1 2 \frac{1}{2} 21的可能性,用 ? ? ?号来表示。期望得分是多少
分析
那么首先设
f
[
n
]
f[n]
f[n]表示到
n
n
n的总期望
c
o
m
b
o
combo
combo,
g
[
n
]
g[n]
g[n]表示到
n
n
n的连续一段
o
o
o的总长度,
那么就可以得到
- s [ n ] = x , f [ n ] = f [ n − 1 ] , g [ n ] = 0 s[n]=x,f[n]=f[n-1],g[n]=0 s[n]=x,f[n]=f[n−1],g[n]=0
- s [ n ] = o , f [ n ] = f [ n − 1 ] + 2 × g [ n − 1 ] + 1 , g [ n ] = g [ n − 1 ] + 1 ( 也 就 是 说 , 用 之 前 的 c o m b o , 按 完 全 平 方 公 式 拆 开 , 加 上 的 就 是 2 倍 长 度 + 1 , 同 时 期 望 长 度 也 要 增 加 一 ) s[n]=o,f[n]=f[n-1]+2\times g[n-1]+1,g[n]=g[n-1]+1(也就是说,用之前的combo,按完全平方公式拆开,加上的就是2倍长度+1,同时期望长度也要增加一) s[n]=o,f[n]=f[n−1]+2×g[n−1]+1,g[n]=g[n−1]+1(也就是说,用之前的combo,按完全平方公式拆开,加上的就是2倍长度+1,同时期望长度也要增加一)
- s [ n ] = ? , 其 实 和 o 很 类 似 , 但 是 f [ n ] = f [ n − 1 ] + g [ n − 1 ] + 0.5 ( 后 面 两 项 有 一 半 的 概 率 ) , g [ n ] = ( g [ n − 1 ] + 1 ) ÷ 2 s[n]=?,其实和o很类似,但是f[n]=f[n-1]+g[n-1]+0.5(后面两项有一半的概率),g[n]=(g[n-1]+1)\div 2 s[n]=?,其实和o很类似,但是f[n]=f[n−1]+g[n−1]+0.5(后面两项有一半的概率),g[n]=(g[n−1]+1)÷2
代码
#include <cstdio>
#define rr register
using namespace std;
int n,p; double f[2],g[2];
signed main(){
for (scanf("%d",&n);n;--n){
rr char c=getchar(); p^=1;
while (c!='o'&&c!='x'&&c!='?') c=getchar();
if (c=='x') f[p]=f[p^1],g[p]=0;
else if (c=='o') f[p]=f[p^1]+2*g[p^1]+1,g[p]=g[p^1]+1;
else f[p]=f[p^1]+g[p^1]+0.5,g[p]=(g[p^1]+1)*0.5;
}
return !printf("%.4lf",f[p]);
}