[Tkey] OSU!

更新的题解可看 此处

你说得对但是 恐怖日本病毒会自动向你的电脑中下载 OSU!

题意简述

一个 01 串,每个位置有 pi 的概率为 1,连续的 x1 贡献 x3 的分数,求总分数期望.

解法

我们考虑将前 i 位的期望拓展到前 i+1 位,假设我们已经求出了前 i 位的期望 E(i).

拓展的时候有 pi 的概率为 1,此时的值为 E3(i+1)=(E(i)+1)3=E3(i)+3E2(i)+3E(i)+1 (因为分数是可以直接三次方的,因此我们这么转移),那么这种情况的期望为 pi×E3(i+1)

这里的 (E(i)+1)3 的展开实际上用了种比较泛的写法,实际上,关于为什么它展开是 E3(i) 而不是 E(i)3,是因为我们并不是给 E 做的三次方,而是给分数做的三次方. 假设我们已经有 x 个连续的 1 来贡献 x3 分,那么再添加一个 1 时,分数就会变成 (x+1)3,由此推导出一个有关贡献分数 x2,x1 的式子.

也有另外 1pi 的概率为 0,此时不会有任何变化,即这种情况的期望为 (1pi)×E3(i)

因此,转移总期望为

E3(i+1)=((E(i)+1)3=E3(i)+3E2(i)+3E(i)+1)×pi+(1pi)×E3(i)

可以发现这里还有个问题,就是我们没办法通过 E3(i) 推出 E2(i)E(i)注意,这里的 E3 并不是单纯的三次方,而是表示连续的 x1 贡献 x3 的分数时的期望,E2 同理,因此我们推不出来),又注意到我们只有在新加入一个 1 的时候用到了这样的数据,因此尝试维护一个 E(i) 表示前 i 位且第 i 位为 1 ,并且连续的 x1 贡献 x1 的分数时的期望(因为为 0 的我们用不到,这样定义方便维护). 同样定义 E2.

可以仿效推出转移方程:(因为只剩一种情况了,好推)

E(i+1)=(E(i)+1)×pi

E2(i+1)=(E(i)+1)2 pi=(E2(i)+2E(i)+1)×pi

带入求解即可.

代码

#include<bits/stdc++.h>
using namespace std;
long double a[100001],b[100001],f[100001],p[100001];
int main(){
	int n;
   	cin>>n;
   	for(int i=1;i<=n;++i){
       	cin>>p[i];
       	a[i]=(a[i-1]+1)*p[i];
       	b[i]=(b[i-1]+2*a[i-1]+1)*p[i];
       	f[i]=f[i-1]*(1-p[i])+(f[i-1]+3*b[i-1]+3*a[i-1]+1)*p[i];
   	}
   	printf("%.1Lf",f[n]);
}
posted @   HaneDaniko  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示