题目:OSU! - 洛谷
思路:
设E()表示截止到i所获得的分数;
对于到i点的每一个l,如果第i+1点为1,那么会新增分数3*l^2+3*l+1;
就有递推公式方程:
E()=E()+p[i+1]p*(3*l^2+3*l+1);(p代表截止到i获得长度l的概率);
得:
E()=E()+p[i+1]*(3*E()+3*E()+1);
E()=p[i+1]*(E()+2*E()+1);
E()=p[i+1]*(E()+1);
不断更新这三个值;
代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int N = 1e5 + 10;
double x,y,z;
double p[N],n;
int main() {
cin>>n;
for(int i=1;i<=n;i++) cin>>p[i];
for(int i=1;i<=n;i++)
{
x+=p[i]*(3*y+3*z+1);
y=p[i]*(y+2*z+1);
z=p[i]*(z+1);
}
printf("%.1f\n",x);
return 0;
}