题意:给你一串长度为n的01串。每一个位置上出现1的概率为a[i],让你求每一段连续的1的长度的立方和的期望值。
解法:
从第一位开始推,假设这一位是1,累加就可以了(0没有贡献),然后怎么知道前面是不是有1呢?我们可以推一个式子:(x+1)^3-x^3=3x^2+3x+1 x为加入当前位之前最长的全部是1的后缀的长度。然后维护x^2和x的期望就可以了,其实这都不能算是DP,应该是递推。。。
代码:
var
i,j,k,p,n,m:longint;
a,b,c,f:Array[0..100000]of real;
begin
readln(n);
for i:=1 to n do
begin
readln(a[i]);
b[i]:=(b[i-1]+1)*a[i];
c[i]:=(c[i-1]+2*b[i-1]+1)*a[i];
f[i]:=f[i-1]+(3*c[i-1]+3*b[i-1]+1)*a[i];
end;
writeln(f[n]:0:1);
end.