#期望dp#洛谷 1365 bzoj 3450 Easy

题目

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[n1],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[n1]+2×g[n1]+1,g[n]=g[n1]+1(combo2+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]=?,of[n]=f[n1]+g[n1]+0.5()g[n]=(g[n1]+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]);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值