给定一个序列,一些位置未确定(是\(o\)与\(x\)的几率各占\(50\%\))。对于一个\(ox\)序列,连续\(x\)长度的\(o\)会得到\(x^2\)的收益,请问最终得到的序列的期望收益是多少?
期望DP
一段一段地处理其实并不方便,因为我们并不知道一段连续\(o\)的长度(它会随着你的选择而变化)。
于是换一个思路,发现题目计算答案的方式是平方,而\((x+1)^2=x^2+2x+1\),也就是说,假如前一个位置连续的\(o\)的长度为\(x\)且当前位为\(o\),那么对答案的额外贡献就是\(2x+1\)。(看起来就很DP)
设\(l_i\)为到第\(i\)个位置的连续\(o\)的期望长度,那么:
推一遍就好了。
/*
* @Author: When_C
* @Date: 2020-11-17 20:18:41
* @Last Modified by: When_C
* @Last Modified time: 2020-11-17 20:38:54
*/
#include <cstdio>
#include <iostream>
using namespace std;
const int maxn = 3e5 + 10;
int n;
double l[maxn],f[maxn],Ans;
char c[maxn];
int main(){
scanf("%d%s", &n, c + 1);
for(int i = 1; i <= n; ++ i){
if(c[i] == ‘x‘) l[i] = 0;
else if(c[i] == ‘o‘) l[i] = l[i - 1] + 1.0, Ans += l[i - 1] * 2 + 1.0;
else{
l[i] = (l[i - 1] + 1.0) / 2;
Ans += (l[i - 1] * 2 + 1.0) / 2;
}
} printf("%.4lf\n", Ans);
return 0;
}
bzoj3450 Tyvj1952 Easy(期望DP)题解
原文:https://www.cnblogs.com/whenc/p/13996518.html