概率期望题(期望 DP)做题记录
主要思想
在随机游走中,一般设 \(dp\) 表示当前状态到最终状态的期望是多少,从后往前推(或这说用 dfs
记忆化搜索来实现递推):
最终从 \(1\) 到 \(n\) 的期望就是 \(dp_1\)。
P3830 [SHOI2012]随机树
难点在于第二问:生成树的期望深度。
不 wei zhuo 捏,设 \(dp_{i,j}\) 表示已经有了 \(i\) 个叶子结点,深度大于 \(j\) 的概率。
考虑枚举一棵子树的大小,转移方程如下:
上面分子的部分就是加到一棵子树的概率减去重复的情况,然而我们发现这样仍然有重复情况。
考虑每一种深度情况,即左右子树分别为 \((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\) 的概率为:
意思是前面有 \(r-c-1\) 次面临 \(i\) 的机会都没有选择,这一次选择了。每次算完概率后直接累加答案。
\(dp\) 数组的转移方程为:
初始状态:\(dp_{0,0}=1.0\)。目标状态:整个数组。
每次计算幂会增加一大把常数,可以预处理 \((1-p_i)\) 的幂次,复杂度 \(\mathcal{O(Tnr)}\) 转移。