期望收益
金牌导航 期望-3
题目大意
给你一个01串,有些位置是未知的,连续的x个1贡献为想x2x^2x2,现在问你该串的期望贡献
输入样例
4
????
输出样例
4.1250
数据范围
1⩽n⩽3×1051\leqslant n \leqslant 3\times 10^51⩽n⩽3×105
解题思路
设fif_ifi为前i个数的期望贡献,sis_isi为以i为右端的连续1的期望长度
对当前位置为1的贡献,把(x+1)2(x+1)^2(x+1)2拆成x2+2×x+1x^2+2\times x + 1x2+2×x+1
x2x^2x2为原有贡献
2×x2\times x2×x就是乘期望长度
然后分类DP即可
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 300010
using namespace std;
int n;
double f[N], s[N];
string str;
int main()
{scanf("%d", &n);cin>>str;for (int i = 1; i <= n; ++i){if (str[i - 1] == 'o')//当前位置为1{f[i] = f[i - 1] + s[i - 1] * 2 + 1;s[i] = s[i - 1] + 1;}else if (str[i - 1] == 'x')f[i] = f[i - 1];else{f[i] = f[i - 1] + (s[i - 1] * 2 + 1) / 2;//各有一半的概率s[i] = (s[i - 1] + 1) / 2;}}printf("%.4lf", f[n]);return 0;
}