概率期望题(期望 DP)做题记录

主要思想

随机游走中,一般设 \(dp\) 表示当前状态到最终状态的期望是多少,从后往前推(或这说用 dfs 记忆化搜索来实现递推):

\[dp_u=E_{move}+\sum_{v\in S_v}\frac{p_v}{\sum p_v}\times dp_{v} \]

最终从 \(1\)\(n\) 的期望就是 \(dp_1\)

P3830 [SHOI2012]随机树

难点在于第二问:生成树的期望深度。

不 wei zhuo 捏,设 \(dp_{i,j}\) 表示已经有了 \(i\) 个叶子结点,深度大于 \(j\) 的概率。

考虑枚举一棵子树的大小,转移方程如下:

\[dp_{i,j}=\sum_{k=1}^{i-1}\dfrac{dp_{k,j-1}+dp_{i-k,j-1}-dp_{k,j-1}\times dp_{i-k,j-1}}{i-1} \]

上面分子的部分就是加到一棵子树的概率减去重复的情况,然而我们发现这样仍然有重复情况。

考虑每一种深度情况,即左右子树分别为 \((1,i-1),(2,i-2),\dots,(i-1,1)\) 的情况的概率,可以将整棵树用加点方式 \(LRLLR\dots RLRLL\) 类似的序列表示出来。

它是一个有 \(k\)\(L\)\(i-k\)\(R\) 组成的操作序列,那么总共有 \(\dfrac{(i-2)!}{(k-1)!(i-k-1)!}\) 中不同的序列。

考虑计算生成一棵 \(n\) 个点的数的方案数:第一次只有 \(1\) 中选择,第二次有 \(2\) 种选择,……那么方案数就是 \((n-1)!\)

同理,给定左右子树大小,生成树的方案数是 \((k-1)!(i-k-1)!\) 的。

个上面的式子结合起来会发现方案数等于 \((i-2)!\),竟然与 \(k\) 无关!也就是说,无论左右子树到底多大,方案数都是相同的,所以有 \(\dfrac{1}{i-1}\)

P3239 [HNOI2015]亚瑟王

写了两个假算,终于改对了。

首先肯定考虑将每张牌打出的概率算出来,每一轮考虑过来。

一开始打的假算考虑的是计算在当前面对第 \(i\) 轮第 \(j\) 张牌时,这一轮前面的牌都没有选择,自己选择的概率

发现这样在前面的牌被轮空的时候,难以计算选择这张牌的概率,所以需要记录前面被轮空了几张牌。

\(dp_{i,j}\) 表示在整一局游戏中,在前 \(i\) 张牌中,选择了 \(j\) 张牌的概率。

面临第 \(i\) 张牌,前面已经选择了 \(c\) 张牌时,选择 \(i\) 的概率为:

\[dp_{i-1,c}\times (1-p_i)^{r-c-1}\times p_i \]

意思是前面有 \(r-c-1\) 次面临 \(i\) 的机会都没有选择,这一次选择了。每次算完概率后直接累加答案。

\(dp\) 数组的转移方程为:

\[dp_{i,c}=dp_{i-1,c}\times (1-p_i)^{r-c}+dp_{i-1,c-1}\times \left(1-(1-p_i)^{r-c+1}\right) \]

初始状态:\(dp_{0,0}=1.0\)。目标状态:整个数组。

每次计算幂会增加一大把常数,可以预处理 \((1-p_i)\) 的幂次,复杂度 \(\mathcal{O(Tnr)}\) 转移。

posted @ 2022-04-08 08:44  EricQian06  阅读(51)  评论(0编辑  收藏  举报