您的位置:首页 > 其它

CodeForces 235B Let's Play Osu!(概率dp)

2016-06-15 13:11 309 查看
题意:给出一个ox序列,每一段连续的o的得分是o的数量的平方,现在给出每一个位置为o的概率,问得分的期望。

思路:首先这道题要将每一个位置分开来看,计算他们对于总体期望的贡献才可以,如果暴力dp的话O(n2)的复杂度时间无法承受。

考虑一段长度为n的连续序列o…o,总共的得分是n2,可以看成是由每个o贡献1分以及任意一对o(可以不相邻,于是共有C2n组)贡献2分组成的,这个性质反过来证明很容易,但是想了好久没想懂是怎么来的。。。。。官方题解里也说的不清楚

个人观点是可以把n2写成(1+...+1)n然后分解这个式子,所以每个位置的贡献就是自己本身和与任意其他位置的组合数量。

知道了这个性质以后,后面就比较好做了,假设当前位置为j,那么j对总体的贡献就是j为1的贡献加上j与其他所有位置配对的贡献,这一步可以用dp来做,所以最后的答案就可以得到了。

#include <bits/stdc++.h>
#define eps 1e-6
#define LL long long
#define pii pair<int, int>
#define pb push_back
#define mp make_pair
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;

const int MAXN = 5000000;
//const int MOD = 1e9+7;
//const int INF = 0x3f3f3f3f;
int n;
double dp[MAXN], p[MAXN], ans;
int main()
{
//freopen("input.txt", "r", stdin);
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%lf", &p[i]);
for (int i = 1; i <= n; i++) {
dp[i] = (dp[i-1]+p[i-1])*p[i];
ans += dp[i]*2 + p[i];
}
printf("%.9f", ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  codeforces 概率dp