算法学习笔记:期望/概率 DP

前言

教练讲之前我是完全不会的啊,讲完了感觉大脑旋转。

主要写题单里的题的题解。

预备知识

离散型随机变量的期望

设离散型随机变量 X 的概率分布为 pi=P(X=xi),则 X期望 E(X) 定义为

pixi

连续型随机变量的期望

设离散型随机变量 X 的密度函数为 f(x),则 X期望 E(X) 定义为

xf(x)dx

题单练习

Luogu P5104 红包发红包

题意

有一个 w 元的红包,若红包剩下 w 元,则这个人抢到的钱数是从 [0,w] 等概率随机生成的实数 x。问第 k 个人期望抢到的钱数,答案对 109+7 取模。

对于所有数据,0<w<109+71k1018

题解

设第一个人抢到的钱数为 x,则 x 的分布函数 f(x)=[x[0,w]]1w。那么所求的期望就是

E(x)=0wxwdx=w2

对于第二个人,期望剩下 w2 元,那么期望抢到的钱数就是 w4……以此类推,第 k 个人期望抢到的钱数就是 w2k。快速幂 O(logk) 求解即可。

Luogu P6154 游走

题意

给定一个 n 个点 m 条边的 DAG,问从所有路径中(路径可以为一个点),等概率随机选择其中一条的期望长度,答案对 998244353 取模。

对于所有数据,1n1051m7×105

题解

它都不是期望 DP 题。期望长度即路径长度总和除以路径总条数,DAG 上 DP 统计即可。时间复杂度 O(n+m)

Luogu P4316 绿豆蛙的归宿

题意

给定一个 n 个点 m 条边的带权 DAG,起点为 1 号点,终点为 n 号点,保证从起点出发能到达所有点,所有点也都能到达终点。现在绿豆蛙从起点走到终点,每次从所有能到达的点中等概率选择一个走,问走的路径的期望长度。

对于所有数据,1n1051m2n

题解

裸题。令 fu 表示 un 的期望路径长度,在反图上 DP 即可。时间复杂度 O(n+m)

Luogu P1850 [NOIP 2016 提高组] 换教室

题意

一个人需在 n 个时间段选课,每时间段有原教室 ci 和可选教室 di。他可以最多申请 m 次更换教室,第 i 个时间段申请成功概率为 pi。所有申请需一次性提交,每个时间段只能申请一次。所有教室构成一个 v 个点 e 条边的无向带权图,课间移动消耗的体力为两教室间的最短路径,求总体力消耗的期望最小值。

对于所有数据,1n2×1030m2×1031v3000e9×104

题解

经典题。先 Floyd 预处理多源最短路,然后容易想到令 fi,j,0/1 表示考虑前 i 个时间段,共使用 j 次申请次数,第 i 个时间段是否申请换教室的期望最小值。分讨第 i1 个和第 i 个时间段分别是否申请成功容易得到转移方程:

fi,j,1=min{fi1,j1,0+dis(ci1,di)×pi+dis(ci1,ci)×(1pi),fi1,j1,1+dis(di1,di)×pi1pi+dis(di1,ci)×pi1(1pi)+dis(ci1,di)×(1pi1)pi+dis(ci1,ci)×(1pi1)(1pi)fi,j,0=min{fi1,j,0+dis(ci1,ci),fi1,j,1+dis(di1,ci)×pi1+dis(ci1,ci)×(1pi1)

时间复杂度 O(v3+nm)

Luogu P3412 仓鼠找sugar II

题意

给定一棵 n 个点的树,小仓鼠想从任意的起点 s 走到任意的终点 t,每次会从所有相邻的节点中等概率随机选择一个走,问走的路径长度的期望,答案对 998244353 取模。

对于所有数据,1n105

题解

妙妙题。枚举终点 t 作为树的根节点,然后你发现它可以往回走,导致你如果设计 fu=E(dis(u,t)) 会有后效性,n 的范围显然不允许我们做高斯消元。

考虑一些高妙的东西,注意到某个点 ut 随机走出来的路径必然会包含 path(u,t) 上的边,所以我们有

E(dis(u,t))=xpath(u,t)xtE(dis(x,fax))

很自然地想到设计 fu=E(dis(u,fau))(ut),但这个好像还是列不出普通的转移方程啊!但是我们仔细考虑 u 如何能走到 fau。首先它有 1degu 的概率可以直接走到 fau,其次对于每个子节点 vsonu,它还有 1degu 的概率走到 v,然后再沿 vufau 走到 fau。于是我们可以列出一个神秘的方程:

fu=1degu+1deguvsonufv+fu+1

解方程可以得到

fu=degu+vsonufv

于是我们可以树形 DP 求出所有 fu 了!然后对于一条边 (u,fau),显然它是 szu 个节点向上走的必经边。我们令 ft=0,则 anst=u=1tszufu

枚举 t,把所有 anst 加起来再除以 n2 就是答案,于是我们有了 O(n2) 的做法。转移方程是个和式,某个点的贡献容易增删,显然可以换根 DP 优化到 O(n)。实现时注意一下换根前后根节点的贡献即可。

其实我们也有不那么高妙的角度。我们回到令 fu=E(dis(u,t)),转移方程就是 fu=1degu(u,v)Efv+1。从叶子节点开始考虑,那么 fu 的值只和 ffau 有关,进一步扩展到某个叶子结点的父亲 u,它的每个儿子都可以表示成有关 fu 的一次函数,代入得到 fu 的值又只与 ffau 有关……这样向上递推,容易发现 fu 最终就是一个关于 ffau 的一次函数,可以记录系数树形 DP 求解。再去记录子树的 fu 和容易拓展到换根 DP 的形式。时间复杂度还是 O(n) 的。显然两种角度本质相同。

Luogu P1654 OSU!

题意

有一个长度为 n0/1 串,第 i 个位置有 pi 的概率为 11pi 的概率为 0。定义这个串的价值为所有极长连续 1 段的长度的立方和。求这个串的期望价值。

对于所有数据,1n105

题解

考虑从当前位置 i 向左扩展的极长连续 1 段,它的长度 x 增加 1 后带来的贡献为 (x+1)3x3=3x2+3x+1,因此想到维护从当前位置向左扩展的极长连续 1 段的长度的期望 fi 和长度的平方的期望 gi。容易得到转移方程:

fi=1pi(fi1+1)gi=1pi(gi1+2fi1+1)

对于答案的期望 ansi 也有类似的转移:

ansi=ansi1+1p(3fi1+3gi1+1)

请注意这两种转移的微妙区别,fi,gi 维护的是从当前位置 i 向左扩展的极长连续 1 段的长度/长度平方的期望,而 ansi 维护的是所有极长连续 1 段的长度的立方和期望。

时间复杂度为 O(n)

Luogu P3211 [HNOI2011] XOR和路径

题意

给定一个 n 个点 m 条边的带权无向连通图。你想从 1 号点走到 n 号点,每次会从所有相邻的节点中等概率随机选择一个走,问路径上边权异或和的期望值。

对于所有数据,2n1001m104

题解

n 的范围强烈引导我们做高斯消元。令 fu 表示 un 的路径上边权异或和的期望值。容易得到转移方程:

fu=1degu(u,v,w)Efvxorw

这种形式当然不能高斯消元。考虑拆位,那么转移方程变成:

fu=1degu(u,v,w)E[w=0]fv+[w=1](1fv)

最后对应累加答案即可。时间复杂度为 O(n3logV)。实现时注意判自环。

posted @   P2441M  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示