#期望dp#洛谷 1365 bzoj 3450 Easy

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sugar_free_mint/article/details/86678545

题目

n n 次点击要做,成功了就是 o o ,失败了就是 x x ,分数是按 c o m b o combo 计算的,连续 a a c o m b o combo 就有 a × a a\times a 分, c o m b o combo 就是极大的连续 o o 。有些地方 o o 或者 x x 各有 1 2 \frac{1}{2} 的可能性,用 ? ? 号来表示。期望得分是多少


分析

那么首先设 f [ n ] f[n] 表示到 n n 的总期望 c o m b o combo , g [ n ] g[n] 表示到 n n 的连续一段 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 ] = 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 ] + 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

代码

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

猜你喜欢

转载自blog.csdn.net/sugar_free_mint/article/details/86678545