bzoj 4318: OSU!【期望dp】
思路有点眼熟啊,就是设l1记录长为x的极长全1串贡献x的答案,l2记录长为x的极长全1串贡献x^2的答案,f记录真正的答案
转移的话根据n-(n-1)=1,n2-(n-1)2=2n-1,n3-(n-1)3=3n^2-3n+1直接转移即可
#include<iostream>
#include<cstdio>
using namespace std;
const int N=100005;
int n;
double a,l1[N],l2[N],f[N];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lf",&a);
l1[i]=(l1[i-1]+1)*a;
l2[i]=(l2[i-1]+2*l1[i-1]+1)*a;
f[i]=f[i-1]+(3*l2[i-1]+3*l1[i-1]+1)*a;
}
printf("%.1f",f[n]);
return 0;
}