期望概率 dp

P4316 绿豆蛙的归宿

  • 期望就要倒推,因为如果是正推可能还要记录概率,而且感觉不正确

  • 参考代码

P1850 [NOIP2016 提高组] 换教室

  • \(dp[i][j][0/1]\) 表示此时是第 \(i\) 节课,换了几次,这次换不换

  • 预处理出两个点之间的最短路就可以了

P3802 小魔女帕琪

  • 可以先手动算一下,在第 7 位时能够组成的概率和在第 8 位是一样的,那么大胆猜结论,在每个位置的概率都是一样的,然后就没了

P5104 红包发红包

  • 对于每个人,假设当前能取的值为 \(w\) ,那么它期望取到 \(\frac{w}{2}\)

  • 那么这个题目答案就是 \(\frac{w}{2^k}\)

P4550 收集邮票

  • \(f_i\) 为已经取完 \(i\) 个,取完剩下的期望次数

\[f_i=\frac{i}{n}(f_i+1)+\frac{n-i}{n}(f_{i+1}+1) \]

  • 但是期望的钱和期望步数不是直接挂钩的

  • \(g_i\) 表示相应需要的钱

\[g_i=\frac{i}{n}(g_i+f_i+1)+\frac{n-i}{n}(g_{i+1}+f_{i+1}+1) \]

P1291 [SHOI2002]百事世界杯之旅

  • 和上题一样,答案就是 \(n(\frac{1}{1}+\frac{1}{2}+...\frac{1}{n})\)

P3239 [HNOI2015]亚瑟王

  • 一个朴素的思路就是求出每个牌作贡献的概率

  • 那么问题就转换成了求一个牌 \(r\) 轮后会发动过的概率

  • 考虑第一个牌,发动的概率:\(1-(1-p_i)^{r}\)

  • 但是对于后面的牌来说,有一个很恶心的点在于如果前面发动了一个牌,那么就直接结束这一轮了

  • 那么我们表示出一个牌在哪些轮是会被考虑到的

  • \(f[i][j]\) 表示所有游戏完了后前 \(i\) 个牌中出了 \(j\) 个的概率

  • \(P(i)=\sum_{j=0}^r f[i-1][j]*(1-(1-p_i)^{r-j})\)

  • 那么我们就是要求 \(f[i][j]\)

  • 考虑枚举 \(i\) 是否有贡献来转移就可以了

P3750 [六省联考 2017] 分手是祝愿

  • 神题

  • 首先有个性质:确定了所有灯的状态后最少的次数(必须的次数)就确定了,大概从右往左扫一遍就可以求出来了

  • 还有个性质:每一个键都无法用其他键组合而成

  • 也就是这些必须键必须按到具体上,如果按错了,那么还需要在同一个按键上按回来

  • 那么设 \(f[i]\) 为从还剩 \(i\) 个必须键到还剩 \(i-1\) 个必须键的期望次数

\[f[i]=\frac{i}{n}\times 1+ \frac{n-i}{n}(f[i]+f[i+1]+1) \]

  • 分别表示按的是不是必须键

  • 答案就是 \(f[cnt]+f[cnt-1]+...+f[k+1]\)

P1297 [国家集训队]单选错位

  • 考虑每一对相邻的选项对答案的贡献

P3412 仓鼠找sugar II

  • 首先定一个根

  • \(f[i]\) 表示 \(i\) 到父亲的期望步数

\[f[i]=\frac{1}{deg_i}(\sum_v (1+f[v]+f[u]) +1) \]

\[f[i]=deg_i+\sum_v f[v] \]

  • \(g[i]\) 表示 \(fa[i]\)\(i\) 的期望步数,同理

\[g[i]=\frac{1}{deg_{fa}}(1+(g[fa[i]]+1+g[i] +)+(\sum_{fa[v]=fa[i],v\neq i }1+f[v]+g[i]) ) \]

\[g[i]=f[fa[i]]-f[i]+g[fa[i]] \]

  • 通过边界条件,\(f,g\) 可以线性求出

  • 对于每个点求到根的和 \(F,G\)

  • 那么考虑 \((u,v)\) ,其实就是 \(u\to lca(f)+lca\to v(g)\) 的一个贡献,也就是 \(F(u)-F(lca)+G(v)-G(lca)\)

  • 那么考虑点 \(u\)\(lca\) 时候的贡献,这个可以通过扫一遍子节点得到

  • 总的复杂度就是 \(O(n)\)

P3232 [HNOI2013]游走

  • 考虑先求出每个点期望经过的次数,不能算 \(f_n\) ,因为到了 \(n\) 就停下了

  • 那么对于一条边 \((u,v)\) 期望经过的次数就是 \(\frac{f_u}{d_u}+\frac{f_v}{d_v}\)

P1365 WJMZBMR打osu! / Easy

  • \(E(F_i)=E(F_{i-1}+\Delta_i)=E(F_{i-1})+E(\Delta_i)\)

  • \(x\) 时,\(E(\Delta_i)=0\)

  • \(o\) 时,假设之前的 \(o\) 的长度为 \(len\)\(E(\Delta_i)=E(2\times len+1)=2\times E(len)+1\)

  • \(?\) 时,\(E(\Delta_i)=\frac{0+2\times E(len)+1}{2}\)

  • 所以我们在递推的时候,不只需要求期望的答案,还要求期望的长度

  • 上面证明了为什么可以用期望的长度来算期望的长度

P3317 [SDOI2014]重建

  • 矩阵树定理实际上求的是 \(\sum_T \prod_{e\in T} p_e\)

  • 这个题求的是 \(\sum_T\prod_{e\in T}p_e\frac{\prod_e (1-p_e)}{\prod_{e\in T} (1-p_e)}\)

  • 把无关的提出来,剩下的就按照矩阵树定理来做

P3830 [SHOI2012]随机树

  • 第一问好说

  • 第二问,对于一棵树,我们考虑跟节点的两个子树

  • 这两个子树之间的形态的概率是一样的

  • 这个恰好不是很好看,改成大于等于

  • \(f[i][j]\) 表示 \(i\) 个叶子,深度 \(\geq j\) 的概率,那么

\[f[i][j]=\sum_{k=0}^i(f[k][j-1]+f[n-k][j-1]-f[k][j-1]*f[n-k][j-1]) \]

P4562 [JXOI2018]游戏

  • 先将关键数字筛出来,假设有 \(k\)

  • 那么就是求关键数字全部被选完最末尾的数字的期望位置,然后乘上 \(n!\)

  • 那么求出最后一个位置在某个位置的概率,这个显然可以用组合数学来做

P4206 [NOI2005] 聪聪与可可

  • 可以说很暴力的一个做法

  • 先预处理出 \(nxt[u][v]\) 表示 \(u\)\(v\) 的下一步是哪个点

  • \(f[u][v]\)\(u\)\(v\) 的期望,我们直接暴力的做,记忆化搜索

  • 总的复杂度是 \(O(n^2)\)

P6046 纯粹容器

  • \(E(i)=\sum_x P[t_i\geq x]\)

  • 考虑第 \(x\)\(i\) 仍然存活的概率

  • 我们将每次操作看成一种合并的话,总的方案数就是 \(x!\binom{n-1}{x}\)

  • 对于一个数,找到它前面第一个比它大的数,和后面第一个比它大的数,假设为 \(pre,nxt\)

  • 那么如果这个数和 \(pre\) 之后到自己的边合并,就不会有任何影响,否则自己一定就会被吃掉

  • \(pre-i\) 都被选的概率为 \(P(A)\) ,设 \(i-nxt\) 的概率是 \(P(B)\)

  • 那么 \(P[t_i\geq x]=1-P(A)-P(B)+P(AB)\)

P5575 [CmdOI2019]黑白图

  • 对于这种高维的期望,有一些套路

  • 考虑对于一个序列的 \(E(\Delta)\) ,假设之前的联通块的长度为 \(x\)

  • \(E(i)=E((x+1)^k)\)

  • 这个地方肯定不能将 \(x+1\) 拆了,因为 \(E(xy)=E(x)E(y)\) 只有在 \(x,y\) 不相关的时候有用

  • 所以我们需要先用二项式在里面变换一下,再拆开

\[E((x+1)^k)=E(\sum_{i=0}^k\binom{k}{i}x^i)=E(\binom{k}{0}x^0)+E(\binom{k}{1}x^1+...) \]

\[\binom{k}{0}E(x^0)+\binom{k}{1}E(x^1)+... \]

  • 所以我们需要维护 \(E(x),E(x^1),...,E(x^k)\)

  • 放在树上也是一样的套路

  • \(f[u][p]\) 表示以 \(u\) 为节点期望下 \(x^p\) 的和

  • \(sum[u]\) 表示以 \(u\) 为节点期望下除了 \(x\) 的联通块剩下的联通块的 \(k\) 次方和的期望

  • 转移参考:

void dfs(int num)
{
  f[num][0]=1;
  for (int i=0,v;i<g[num].size();i++)
   if (!f[v=g[num][i]][0]){
     dfs(v);
     sum[num]=(sum[num]+(mod+1-p[num])*f[v][k]+sum[v])%mod;
     for (int j=k;j;j--){
       ll sav=0;
       for (int p=0;p<=j;p++)
         sav=(sav+C[j][p]*f[num][p]%mod*f[v][j-p])%mod;
       f[num][j]=sav;
     }
   }
  for (int j=k;j;j--){
    ll sav=0;
    for (int p=0;p<=j;p++)
      sav=(sav+C[j][p]*f[num][p])%mod;
    f[num][j]=sav*p[num]%mod;
  }
}
  • 对于基环树,考虑先确定一个点为白点,然后就可以当成一条链来做

  • 然后再确定这个点为黑点,确定下一个点为白点,然后就又可以当成一条链来做了,然后依次类推

  • 那么复杂度就是 \(O(n^2k^2)\)

  • 还有优化成 \(O(nk^3)\) ,这里就不说了

CF908D New Year and Arbitrary Arrangement

  • 如果一开始是一堆 \(b\) ,可以把这些 \(b\) 都去掉,然后再继续

  • 所以我们钦定第一个就是 \(a\)

  • 每次放 \(a,b\) 对于前面的影响有关于前面的 \(a\) 数量,又因为有限制,所以带上前面 \(ab\) 的数量

  • 因为是期望,考虑倒推

  • \(f[i][j]\) 表示前缀有 \(i\)\(a\) ,有 \(j\)\(ab\) 期望的子序列个数

\[f[i][j]=A\times f[i+1][j]+B\times f[i][j+i] \]

  • 边界就是 \(j+i\geq k\) ,此时就可以立刻停止了

  • \(i+j\geq k\) 时,期望的子序列个数就是 \(i+j+\frac{p_a}{p_b}\)

  • 具体证明可以参考几何分布的证明,几个可能对推式子有用的式子:

\[\sum_{i=0}^{\infty} x^i=\frac{1}{1-x} \]

\[\sum_{i=0}^{\infty} ix^i=\frac{x}{(1-x)^2} \]

CF804D Expected diameter of a tree

  • 对于一次询问,可以做到 \(O(n)\)

  • 对于多次询问,其实没有更好的解决方法了,而事实上对于这个题目有一点点根号分治的感觉

  • 所以考虑记忆化,复杂度是正确的

CF1151F Sonya and Informatics

  • 可以发现最终的状态就是前面 \(x\) 个 0 ,后面全是 1

  • 那么考虑上一轮是由哪一些状态转移过来

  • 一种是上一次就是这样,然后选择到的是 \((1,1)\) 或者 \((0,0)\)

  • 一种就是上一次的选择是 \((1,0)\) ,也就是我们需要知道上一次前 \(x\) 个位置中有 \(x-1\) 个 0 的概率

  • 那么我们设 \(f_{i,j}\) 表示第 \(i\) 轮前 \(x\) 个中有 \(j\) 个 0 的概率

  • 那么显然一个 \(j\) 只会和上一轮的 \(j-1,j,j+1\) 有关

  • 观察到这个 \(n\leq 1e9\) ,那么很明显要用到矩乘

  • 我们将这个系数矩阵建出来,然后矩乘就可以了

posted @ 2022-06-04 10:05  Kzos_017  阅读(39)  评论(0编辑  收藏  举报