[期望DP] WJMZBMR打osu! / Easy

题面

就是一道很正常的期望 \(DP\) 但是我太菜了不会打\kk

式子直接用长度平方推,推出来大力化简一下即可

代码:

# include <iostream>
# include <cstdio>
# include <string>
# define MAXN 300005

long double f[MAXN];

int main(){
	int n; std::string s;

	std::cin>>n>>s;

	double len = 0;
	for(int i = 1; i <= n; i++){
		// if(s[i-1] == 'o'){ // 这个式子是假的,用没有推出的式子计算没有推出的结果
		// 	len++;
		// 	f[i] = f[i-1] + (2.00*len-1.00);
		// }
		// else if(s[i-1] == 'x'){
		// 	len = 0;
		// 	f[i] = f[i-1];
		// }
		// else if(s[i-1] == '?'){
		// 	len = (len+1.00)*0.5;
		// 	f[i] = f[i-1] + len - 0.5;
		// }
		if(s[i-1] == 'o'){
			f[i] = f[i-1] + (2.00*len+1.00);
			len++;
		}
		else if(s[i-1] == 'x'){
			f[i] = f[i-1];
			len = 0;
		}
		else if(s[i-1] == '?'){
			f[i] = f[i-1] + len + 0.5;
			len = (len + 1.00) * 0.5;
		}
	}

	printf("%.4Lf", f[n]);

	return 0;
}
posted @ 2020-09-20 14:24  ChPu437  阅读(78)  评论(0编辑  收藏  举报