[Tkey] OSU!
更新的题解可看 此处
你说得对但是 恐怖日本病毒会自动向你的电脑中下载 OSU!
题意简述
一个 01 串,每个位置有 \(p_{i}\) 的概率为 \(1\),连续的 \(x\) 个 \(1\) 贡献 \(x^{3}\) 的分数,求总分数期望.
解法
我们考虑将前 \(i\) 位的期望拓展到前 \(i+1\) 位,假设我们已经求出了前 \(i\) 位的期望 \(E(i)\).
拓展的时候有 \(p_{i}\) 的概率为 \(1\),此时的值为 \(E_{3}(i+1)=(E(i)+1)^{3}=E_{3}(i)+3E_{2}(i)+3E(i)+1\) (因为分数是可以直接三次方的,因此我们这么转移),那么这种情况的期望为 \(p_{i}\times E_{3}(i+1)\)
这里的 \((E(i)+1)^{3}\) 的展开实际上用了种比较泛的写法,实际上,关于为什么它展开是 \(E_{3}(i)\) 而不是 \(E(i)^{3}\),是因为我们并不是给 \(E\) 做的三次方,而是给分数做的三次方. 假设我们已经有 \(x\) 个连续的 \(1\) 来贡献 \(x^{3}\) 分,那么再添加一个 \(1\) 时,分数就会变成 \((x+1)^{3}\),由此推导出一个有关贡献分数 \(x^{2},x^{1}\) 的式子.
也有另外 \(1-p_{i}\) 的概率为 \(0\),此时不会有任何变化,即这种情况的期望为 \((1-p_{i})\times E_{3}(i)\)
因此,转移总期望为
可以发现这里还有个问题,就是我们没办法通过 \(E_{3}(i)\) 推出 \(E_{2}(i)\) 和 \(E(i)\) (注意,这里的 \(E_{3}\) 并不是单纯的三次方,而是表示连续的 \(x\) 个 \(1\) 贡献 \(x^{3}\) 的分数时的期望,\(E_{2}\) 同理,因此我们推不出来),又注意到我们只有在新加入一个 \(1\) 的时候用到了这样的数据,因此尝试维护一个 \(E(i)\) 表示前 \(i\) 位且第 \(i\) 位为 \(1\) ,并且连续的 \(x\) 个 \(1\) 贡献 \(x^{1}\) 的分数时的期望(因为为 \(0\) 的我们用不到,这样定义方便维护). 同样定义 \(E_{2}\).
可以仿效推出转移方程:(因为只剩一种情况了,好推)
带入求解即可.
代码
#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]);
}