CodeForces - 236D Let's Play Osu![概率DP]

Description:

You're playing a game called Osu! Here's a simplified version of it. There are n clicks in a game. For each click there are two outcomes: correct or bad. Let us denote correct as "O", bad as "X", then the whole play can be encoded as a sequence of n characters "O" and "X".

Using the play sequence you can calculate the score for the play as follows: for every maximal consecutive "O"s block, add the square of its length (the number of characters "O") to the score. For example, if your play can be encoded as "OOXOOOXXOO", then there's three maximal consecutive "O"s block "OO", "OOO", "OO", so your score will be 22 + 32 + 22 = 17. If there are no correct clicks in a play then the score for the play equals to 0.

You know that the probability to click the i-th (1 ≤ i ≤ n) click correctly is pi. In other words, the i-th character in the play sequence has pi probability to be "O", 1 - pi to be "X". You task is to calculate the expected score for your play.

Input

The first line contains an integer n (1 ≤ n ≤ 105) — the number of clicks. The second line contains n space-separated real numbers p1, p2, ..., pn (0 ≤ pi ≤ 1).

There will be at most six digits after the decimal point in the given pi.

Output

Print a single real number — the expected score for your play. Your answer will be considered correct if its absolute or relative error does not exceed 10 - 6.

Examples

Input

3
0.5 0.5 0.5

Output

2.750000000000000

Input

4
0.7 0.2 0.1 0.9

Output

2.489200000000000

Input

5
1 1 1 1 1

Output

25.000000000000000

Note

For the first example. There are 8 possible outcomes. Each has a probability of 0.125.

  • "OOO"  →  32 = 9;
  • "OOX"  →  22 = 4;
  • "OXO"  →  12 + 12 = 2;
  • "OXX"  →  12 = 1;
  • "XOO"  →  22 = 4;
  • "XOX"  →  12 = 1;
  • "XXO"  →  12 = 1;
  • "XXX"  →  0.

So the expected score is 

题意:

给n个位置,给出1-n上每个位置出现O的概率pi,记分规则如下,连续的x个O记为x^2分,求和,如 XXOOOXOXOOXX得分为

求得分的期望

思考一下,我们能比较容易地得出O(n^2)的方法

令dp[i]为前i的得分期望

那么

显然这题

考虑一下变换记分的方式

我们有

那么记分方式就变为

一段连续的O,有多少对O×2+O的个数

一对O可以贡献2分

现在得分来源变为两个地方

一对O(2分),和单个O(1分)

我们知道

期望=概率×收益

我们找到每个对O的概率×2

再找到单个O×出现概率

求和即是期望得分

对于某一个点i

有(1,i) (2,i) (3,i) (4,i)...(i-1,i)这些对O,每个概率即是从左到右连乘,比如

令这些概率和为dp[i],即

这样我们有递推关系

对i+1点来说,

 

dp求和即是所有对O出现的概率之和×2+单个O出现的概率×1

求得的即是期望分数

AC代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stdlib.h>
#include<queue>
#include<map>
#include<vector>
#include<math.h>
const int INF = 0x3f3f3f3f;
using namespace std;
typedef long long ll;
typedef double ld;
int i,j,k,l;
const int NN=111111;
double f[NN];
double dp[NN];
int main()
{
	int n;scanf("%d",&n);
	double sum=0;
	for(int i=1;i<=n;i++)
        {
		scanf("%lf",&f[i]);
		sum+=f[i];
	}
	double ans=0;
	for(int i=2;i<=n;i++)
	{
		dp[i]=(dp[i-1]+f[i-1])*f[i];
		ans+=dp[i];
	}
	printf("%.12f\n",ans*2.0+sum);
	return 0;
}

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值