[dp 小计] 期望dp

Updata 7.10 文章重构。
参考了网上许多 blog

什么是期望

我们小学学过概率和平均数。

把事件 A 发生的概率表示为 P(A)
把随机变量 X 的取值期望值记作 E(X)=iP(X=i)×i

简单点就是成立概率乘上成立贡献。

简单的性质

对于两个互不影响的事件(变量) X,Y

  • P(XY)=P(x)×P(y)
  • E(XY)=E(X)E(Y)

证明:
E(XY)=iji×j×P(X=i)×P(Y=j)
=ii×P(X=i)jj×P(Y=j)
=E(X)E(Y)

  • P(XY)=P(x)+P(y)
  • E(X+Y)=E(X)+E(Y)

证明:
E(X+Y)=ijP(X=i)×P(Y=j)×(i+j)
=iijP(X=i)×P(Y=j)+ijj×P(X=i)×P(Y=j)
iP(X=i)=1
E(X+Y)=iP(X=i)+jj×P(Y=j)=E(X)+E(Y)

这是期望的线性性,非常重要。

一些经典例子

A.

证明:概率为 p 的事件期望在 1p 次发生。

运用了极限的思想。
f(0) 表示事件没发生,期望 f(0) 次发生,f(1)=0。表示事件已经发生。
我们可以得到:f(0)=pf(1)+(1p)f(0)+1
根据极限思想合并左右两个 f(0),移项化简,得到 f(0)=1p

B.

n 个随机数 XiXi 等概率的从 [1,m] 中选取,求 maxi=1nXi 的期望值。

运用了经典的转化思想。
先转化问题:maxi=1n=S,则 E(S)=i=1mP(S=i)i

我们发现 P(S=i) 很难求,转化为 P(Si) 比较好求。
直接强制 n 个数都在 [1,i] 之间即可。所以 P(Si)=(im)n

所以 P(S=i)=P(Si)P(Si1),对于程序,使用快速幂即可在 O(mlogn) 时间内解决。

P6406

很强的题目。

题目要求某个容器的存活时间 E(ti),容易得到柿子:E(ti)=x=1P(ti=x)×x

运用上面的技巧,转化为:

E(ti)=x=1P(tix)

找到第 i 个数左右第一个比它大的数 l,r,对于一般的罐子存活时间上界就是 n3。然后容易想到的就是枚举 x,我们现在的问题就变成了有多少种情况操作次数比 x 大。不妨思考为操作 x 次还没有做掉的概率。

不难发现如果选择一个操作一个数位置 p 就是操作 [p,p+1],对于所有位置进行标号,发现所有标号的情况和原序列删除情况成了双射。

考虑枚举取的点数 x,选择一些位置最后乘上一个 x! 变成一个更简单的选择问题。现在问题转化为:

  • (1) 在一个序列选取 x 个点。
  • (2) 不能同时取 i 号点左边的 l 个。
  • (3) 不能取右边(包含自身)的 r 个。

很简单就能想到容斥,因为不满足 (2)(3) 的情况实在是太好求了。我们推出柿子:

x=1nx!(Cn1xCn1lxlCn1rxr+Cn1lrxlr)

这个就是合法的方案数。总方案数就是第一项,概率就是:

x=1nx!(Cn1xCn1lxlCn1rxr+Cn1lrxlr)x!Cn1x

然后约分,问题等价于:

x=1n(Cn1xCn1lxlCn1rxr+Cn1lrxlr)Cn1x

然后我们就能 O(n2) 做掉这题了。

然后可以暴拆柿子做到 O(n),但是没有必要

P3239

题目要求 E(d),根据期望的线性性,考虑每个数的贡献,最后再加起来,也就是 i=1ndpi×di

现在在于问题怎么求 dpi,也就是所有情况这个数贡献的和。

将问题进行等价的转化,设置随机变量:有一个 n×r01 矩阵,每个矩阵里的数都有概率为 01,每次会取每一行第一个出现的 1,取过的列不会再取,问每一列被取的概率之和。

数据范围提示解法应该是 O(nr) 的,考虑到取多次都是相同的,容易想到枚举取到的一行,需要满足之前没有被取然后这一行被取,每一次考虑的都是一个左上方的矩阵,没有后效性,考虑 dp。

考虑刷表,每次增加一列似乎更为容易。

首先,对于第一个数,被取的概率显然是 1(1p1)r,考虑定义 fi,j 表示前 i 个数,取了 j 个的方案数。

  • (1) 不选这个数
    那么,就是 fi,jfi1,j×(1pi)rj

  • (2) 选这个数
    不难发现,只要在任意一处取了都是等价的结果,就是:fi,jfi1,j1×(1(1pi)rj+1)

初始情况就是 f0,0=1

考虑计算最终的答案,dpi,不难在转移的过程中顺便得出。

难点在于转化。

posted @   g1ove  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示