题目
有nnn次点击要做,成功了就是ooo,失败了就是xxx,分数是按combocombocombo计算的,连续aaa个combocombocombo就有a×aa\times aa×a分,combocombocombo就是极大的连续ooo。有些地方ooo或者xxx各有12\frac{1}{2}21的可能性,用???号来表示。期望得分是多少
分析
那么首先设f[n]f[n]f[n]表示到nnn的总期望combocombocombo,g[n]g[n]g[n]表示到nnn的连续一段ooo的总长度,
那么就可以得到
- s[n]=x,f[n]=f[n−1],g[n]=0s[n]=x,f[n]=f[n-1],g[n]=0s[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(也就是说,用之前的combo,按完全平方公式拆开,加上的就是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)÷2s[n]=?,其实和o很类似,但是f[n]=f[n-1]+g[n-1]+0.5(后面两项有一半的概率),g[n]=(g[n-1]+1)\div 2s[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]);
}