[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)\) 的情况实在是太好求了。我们推出柿子:

\[\sum\limits_{x=1}^nx!(C_{n-1}^x-C_{n-1-l}^{x-l}-C_{n-1-r}^{x-r}+C_{n-1-l-r}^{x-l-r}) \]

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

\[\sum\limits_{x=1}^n\dfrac{x!(C_{n-1}^x-C_{n-1-l}^{x-l}-C_{n-1-r}^{x-r}+C_{n-1-l-r}^{x-l-r})}{x!C_{n-1}^x} \]

然后约分,问题等价于:

\[\sum\limits_{x=1}^n\dfrac{(C_{n-1}^x-C_{n-1-l}^{x-l}-C_{n-1-r}^{x-r}+C_{n-1-l-r}^{x-l-r})}{C_{n-1}^x} \]

然后我们就能 \(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\),不难在转移的过程中顺便得出。

难点在于转化。

posted @ 2024-04-26 11:10  g1ove  阅读(41)  评论(0)    收藏  举报