题目链接:传送门
题意描述:
有一个人在玩Osu,这个游戏的内容就是给你一串字符,字符由“O”和“X”组成,那么这个字符串的权值就为连续“O”的个数的平方和,例如 "OOXOOOXXOO",这个字符串的权值为2*2+3*3+2*2 = 17.现在给你长度为n的字符串,给你字符串中每个位置为“O”的概率,让你求权值的期望。(*^_^*)
题目分析:
这道题明显就是概率dp。这道题的权值算法是连续"O"的平方和,那么,我们先假设现在有一个长度为k的连续“O”串,如果再加入一个“O”字符,那么在原本权值的基础上加上(k+1)*(k+1)- k*k = 2*k + 1 = 2*(k+1)-1.所以,我们只有维护前面为连续“O”的概率dp,那么再加一个“O”的概率为2*dp-pi。
代码:
#include<bits/stdc++.h>
using namespace std;
double a[100005], dp, ans;
int n;
int main(){
cin >> n;
for(int i=0;i<n;++i){
double temp;
scanf("%lf", &temp);
dp = dp*temp+temp;
ans += 2*dp - temp;
}
printf("%.7f", ans);
return 0;
}