[dp 小计] 期望dp
Updata 7.10 文章重构。
参考了网上许多 blog
什么是期望
我们小学学过概率和平均数。
把事件 \(A\) 发生的概率表示为 \(P(A)\)。
把随机变量 \(X\) 的取值期望值记作 \(E(X)=\sum_iP(X=i)\times i\)
简单点就是成立概率乘上成立贡献。
简单的性质
对于两个互不影响的事件(变量) \(X,Y\):
- \(P(X\and Y)=P(x)\times P(y)\)
- \(E(XY)=E(X)E(Y)\)
证明:
\(E(XY)=\sum_i\sum_ji\times j\times P(X=i)\times P(Y=j)\)
\(=\sum_ii\times P(X=i)\sum_jj\times P(Y=j)\)
\(=E(X)E(Y)\)
- \(P(X\or Y)=P(x)+P(y)\)
- \(E(X+Y)=E(X)+E(Y)\)
证明:
\(E(X+Y)=\sum_i\sum_j P(X=i)\times P(Y=j)\times(i+j)\)
\(=\sum_ii\sum_j P(X=i)\times P(Y=j)+\sum_i\sum_j j\times P(X=i)\times P(Y=j)\)
\(\because \sum_iP(X=i)=1\)
\(\therefore E(X+Y)=\sum_i P(X=i)+\sum_j j\times P(Y=j)=E(X)+E(Y)\)
这是期望的线性性,非常重要。
一些经典例子
A.
证明:概率为 \(p\) 的事件期望在 \(\frac{1}{p}\) 次发生。
运用了极限的思想。
设 \(f(0)\) 表示事件没发生,期望 \(f(0)\) 次发生,\(f(1)=0\)。表示事件已经发生。
我们可以得到:\(f(0)=pf(1)+(1-p)f(0)+1\)
根据极限思想合并左右两个 \(f(0)\),移项化简,得到 \(f(0)=\frac{1}{p}\)。
B.
有 \(n\) 个随机数 \(X_i\),\(X_i\) 等概率的从 \([1,m]\) 中选取,求 \(\max_{i=1}^nX_i\) 的期望值。
运用了经典的转化思想。
先转化问题:\(\max_{i=1}^n=S\),则 \(E(S)=\sum\limits_{i=1}^m P(S=i)i\)
我们发现 \(P(S=i)\) 很难求,转化为 \(P(S\le i)\) 比较好求。
直接强制 \(n\) 个数都在 \([1,i]\) 之间即可。所以 \(P(S\le i)=(\frac{i}{m})^n\)。
所以 \(P(S=i)=P(S\le i)-P(S\le i-1)\),对于程序,使用快速幂即可在 \(O(m\log n)\) 时间内解决。
P6406
很强的题目。
题目要求某个容器的存活时间 \(E(t_i)\),容易得到柿子:\(E(t_i)=\sum\limits_{x=1}P(t_i=x)\times x\)
运用上面的技巧,转化为:
\(E(t_i)=\sum\limits_{x=1}P(t_i\ge x)\)
找到第 \(i\) 个数左右第一个比它大的数 \(l,r\),对于一般的罐子存活时间上界就是 \(n-3\)。然后容易想到的就是枚举 \(x\),我们现在的问题就变成了有多少种情况操作次数比 \(x\) 大。不妨思考为操作 \(x\) 次还没有做掉的概率。
不难发现如果选择一个操作一个数位置 \(p\) 就是操作 \([p,p+1]\),对于所有位置进行标号,发现所有标号的情况和原序列删除情况成了双射。
考虑枚举取的点数 \(x\),选择一些位置最后乘上一个 \(x!\) 变成一个更简单的选择问题。现在问题转化为:
- \((1)\) 在一个序列选取 \(x\) 个点。
- \((2)\) 不能同时取 \(i\) 号点左边的 \(l\) 个。
- \((3)\) 不能取右边(包含自身)的 \(r\) 个。
很简单就能想到容斥,因为不满足 \((2)(3)\) 的情况实在是太好求了。我们推出柿子:
这个就是合法的方案数。总方案数就是第一项,概率就是:
然后约分,问题等价于:
然后我们就能 \(O(n^2)\) 做掉这题了。
然后可以暴拆柿子做到 \(O(n)\),但是没有必要
P3239
题目要求 \(E(\sum d)\),根据期望的线性性,考虑每个数的贡献,最后再加起来,也就是 \(\sum\limits_{i=1}^n dp_i\times d_i\)
现在在于问题怎么求 \(dp_i\),也就是所有情况这个数贡献的和。
将问题进行等价的转化,设置随机变量:有一个 \(n\times r\) 的 \(01\) 矩阵,每个矩阵里的数都有概率为 \(0\) 或 \(1\),每次会取每一行第一个出现的 \(1\),取过的列不会再取,问每一列被取的概率之和。
数据范围提示解法应该是 \(O(nr)\) 的,考虑到取多次都是相同的,容易想到枚举取到的一行,需要满足之前没有被取然后这一行被取,每一次考虑的都是一个左上方的矩阵,没有后效性,考虑 dp。
考虑刷表,每次增加一列似乎更为容易。
首先,对于第一个数,被取的概率显然是 \(1-(1-p_1)^r\),考虑定义 \(f_{i,j}\) 表示前 \(i\) 个数,取了 \(j\) 个的方案数。
-
\((1)\) 不选这个数
那么,就是 \(f_{i,j}\leftarrow f_{i-1,j}\times(1-p_i)^{r-j}\) -
\((2)\) 选这个数
不难发现,只要在任意一处取了都是等价的结果,就是:\(f_{i,j}\leftarrow f_{i-1,j-1}\times(1-(1-p_i)^{r-j+1})\)
初始情况就是 \(f_{0,0}=1\)。
考虑计算最终的答案,\(dp_i\),不难在转移的过程中顺便得出。
难点在于转化。

浙公网安备 33010602011771号