题目描述
给出
n
和
题目分析
首先对于当前位置,若为0,则贡献为0;若为1,则贡献为
len3i−len3i−1=3×len2i−1+3×leni−1+1
。
根据概率的计算规则,我们可以知道len的期望
leni=(leni−1+1)×pi+(0×(1−pi))=(leni−1+1)×pi
len2i=(len2i−1+2×leni−1+1)×pi
那么若设
dpi
为前
i
个数的期望价值,就有
代码
/**************************************************************
Problem: 4318
User: szpszp
Language: C++
Result: Accepted
Time:160 ms
Memory:3632 kb
****************************************************************/
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define MAXN 100000
#define MAXM
#define INF 0x3f3f3f3f
typedef long long int LL;
template<class T>
void Read(T &x){
x=0;char c=getchar();bool flag=0;
while(c<'0'||'9'<c){if(c=='-')flag=1;c=getchar();}
while('0'<=c&&c<='9'){x=x*10+c-'0';c=getchar();}
if(flag)x=-x;
}
double l[MAXN+10];
double l2[MAXN+10];
double dp[MAXN+10];
int n;
int main(){
Read(n);
double x;
for(int i=1;i<=n;++i){
scanf("%lf",&x);
l[i]=(l[i-1]+1)*x;
l2[i]=(l2[i-1]+2*l[i-1]+1)*x;
dp[i]=dp[i-1]+(3*l2[i-1]+3*l[i-1]+1)*x;
}
printf("%0.1lf\n",dp[n]);
}