BZOJ 4318: OSU!

题目大意:

一个序列,每个位置有p的概率是1,否则是0。

序列中一段连续1的个数为x,则贡献为x^3,且这连续的一段1不能被其余的一段1所包含。

题解:

考虑每一位是1对答案的贡献。

x^3--->(x+1)^3

发现贡献和x^2的期望和x的期望有关。dp求出。

这一位如果是0,则没有贡献。

这题应该可以扩展到x^k,复杂度为O(n*k^2)

并没有验证过是否可以dp 组合数,再通过组合数求x^k。

代码:

#include<cstdio>
using namespace std;
double a[100005],f[100005][3];
int main(){
	int n;
	scanf("%d",&n);
	for (int i=1; i<=n; i++)
		scanf("%lf",&a[i]);
	double ans=0;
	for (int i=1; i<=n; i++){
		f[i][1]=(f[i-1][1]+1)*a[i];
		f[i][2]=(f[i-1][2]+2*f[i-1][1]+1)*a[i];
		ans+=(3*f[i-1][2]+3*f[i-1][1]+1)*a[i];
	}
	printf("%.1f\n",ans);
	return 0;
}

  

posted @ 2018-04-11 15:52  ~Silent  阅读(164)  评论(0编辑  收藏  举报
Live2D