题面
题意
给出一串数,每个数字有a[i]的贡献是’O’,这串数字的分数定义为每一段连续的O的长度的立方和,OXXOO的分数就是13+23=9,求期望分数。
做法
我的做法是考虑以每一个数为该段最后一个数产生的贡献,dp时记三个数a,b,c分别表示这个数是O时,此时最后一段的长度,长度的平方,长度的立方的期望,转移时只要根据下面两式即可。
(
x
+
1
)
2
=
x
2
+
2
∗
x
+
1
(x+1)^2=x^2+2*x+1
(x+1)2=x2+2∗x+1
(
x
+
1
)
3
=
x
3
+
3
∗
x
2
+
3
∗
x
+
1
(x+1)^3=x^3+3*x^2+3*x+1
(x+1)3=x3+3∗x2+3∗x+1
比较难以描述,代码比较好懂。
代码
#include<iostream>
#include<cstdio>
#define db double
#define N 100100
using namespace std;
int n;
db ans,num[N];
struct Num
{
db sum,pf,lf;
}dp[N];
int main()
{
int i,j;
db p;
cin>>n;
for(i=1;i<=n;i++) scanf("%lf",&num[i]);
for(i=1;i<=n;i++)
{
p=num[i];
dp[i].sum=(dp[i-1].sum+1)*p;
dp[i].pf=(1+dp[i-1].pf+2*dp[i-1].sum)*p;
dp[i].lf=(1+dp[i-1].lf+3*dp[i-1].pf+3*dp[i-1].sum)*p;
ans+=dp[i].lf*(1-num[i+1]);
}
printf("%.1f",ans);
}