[OI] 二项式期望 DP

OSU

OSU

yet Another OSU

yet yet Another OSU

OSU 的题目是这样的:有一些相邻的块,给定每一个块的联通概率,每个连通块对答案有 size3 的贡献,求总期望

关于此题我曾写过题解 此处

此类题的关键之处在于,当我们设计了一个线性状态 fi 之后,假如我们基于拼接的思想,尝试维护出来了当前最近的一个连通块个数为 x,其贡献应为 x3,那么现在我们再为其拼接一个块,贡献就会变为 (x+1)3,即 x3+3x2+3x+1,注意到这里还有我们尚未维护的 x2x 项,因此我们还需要维护这两种信息才能对 x3,进行转移. 对于 x2 的维护,显然 (x+1)2=x2+2x+1,因此只需要维护 x 项即可,对于 x 的维护是显然的

引入两个变量 li,si,其中 fi 表示考虑前 i 个,与 i 联通的连通块长度,si 表示前 i 个的总得分

容易想到 li 的转移:当第 i 个为断点时将 li 置零,否则 li=li1+1

考虑 si 的转移:容易想到,当 i 为断点时有 si=si1,否则,我们可以得出 si1=(li1)3+S(其中 S 是一个之前累积的得分),而 si=(li)3+S,根据上述 li 的转移式我们可以知道 li=li1+1,因而有:

si=(li1+1)3+S=(li1)3+3(li1)2+3li1+1

因为 S 不好维护,考虑对两项做差分,消掉 S

si=si1+3(li1)2+3li1

因此,我们只需要维护出 li,即可递推求解 si

下面我们来加上概率考虑

期望有一个性质(期望的线性性)E(a+b)=E(a)+E(b) ,因此有下述转化:

E(si)=E(si1+3(li1)2+3li1)=E(si1)+3E((li1)2)+3E(li1)

对于 i 确定为断点的情况,我们有 li=0,因此 E((li1)2)=E(li1)=0,从而 E(si)=E(si1)

否则,对于 i 确定联通的情况同理,有 E(si)=E(si1)+3(li1)2+3li1

否则,对于随机选择的块,直接用上述两种情况乘对应的概率即可,即:

E(si)=p1×E(si1)+p2×(E(si1)+3E(li1)2+3Eli1)

注意到我们还没有维护 E(li)

对于 i 确定为断点的情况,E(li)=0

对于 i 确定联通的情况,E(li)=Eli1+1=E(li1)+1

否则,按照上述思路,应为

E(li)=p1×0+p2×(E(li1)+1)

接着考虑维护 E((li)2)

对于 i 确定为断点的情况,E((li)2)=0

对于 i 确定联通的情况,E((li)2)=E(li1+1)2=E((li12+2li1+1))=E((li12))+2E(li1)+1

否则,按照上述思路,应为

((li)2)=p1×0+p2×(E(li1+1)2=E((li12+2li1+1))=E((li12))+2E(li1)+1)

因为已经维护过了 E(li),因此至此我们完成了全部变量的维护

#include<bits/stdc++.h>
using namespace std;
int n;
double p[100001],l1[100001],l2[100001],s[100001];
int main(){
    cin>>n;
    for(int i=1;i<=n;++i){
        cin>>p[i];
    }
    for(int i=1;i<=n;++i){
        l1[i]=p[i]*(l1[i-1]+1);
        l2[i]=p[i]*(l2[i-1]+2*l1[i-1]+1);
        s[i]=(1-p[i])*s[i-1]+p[i]*(s[i-1]+3*l2[i-1]+3*l1[i-1]+1);
    }
    printf("%.1lf",s[n]);
}

Another OSU

Another OSU

Another Another OSU

yet Another Another OSU

OSU 的 k 次幂升级版,即贡献变为了 xk

这一次我们不能再像上述一个一个推式子了,我们需要找一个普遍的规律:

对于刚才的问题我们发现:要想维护一个 xk 的贡献,显然需要维护 k[1,k] 的所有 xk 的贡献

有二项式定理,即 (x+y)n=i=0nCnixniyi,考虑设 (fi)k 为我们对 xk 项进行的位置为 i 的转移,效仿刚才的解法,我们会有:

(fi)k=(fi1+a)k=j=0kCnj(fi1)njaj

可以发现在这里实际上用到了全部次数比它低的 fi,因此对于每一个 i,按 k 从小到大维护即可.

此外,除了用二项式定理求 Cni,还可以用杨辉三角来求系数:

杨辉三角递推式:

fi,j={1 j=1orj=ifi1,j1+fi1,jotherwise

posted @   HaneDaniko  阅读(56)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示