BZOJ 4318 OSU!

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yzyyylx/article/details/83186662

题面

题意

给出一串数,每个数字有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 ) 3 = x 3 + 3 x 2 + 3 x + 1 (x+1)^3=x^3+3*x^2+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);
}

猜你喜欢

转载自blog.csdn.net/yzyyylx/article/details/83186662