期望概率 dp

P4316 绿豆蛙的归宿

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

  • 参考代码

P1850 [NOIP2016 提高组] 换教室

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

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

P3802 小魔女帕琪

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

P5104 红包发红包

  • 对于每个人,假设当前能取的值为 w ,那么它期望取到 w2

  • 那么这个题目答案就是 w2k

P4550 收集邮票

  • fi 为已经取完 i 个,取完剩下的期望次数

fi=in(fi+1)+nin(fi+1+1)

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

  • gi 表示相应需要的钱

gi=in(gi+fi+1)+nin(gi+1+fi+1+1)

P1291 [SHOI2002]百事世界杯之旅

  • 和上题一样,答案就是 n(11+12+...1n)

P3239 [HNOI2015]亚瑟王

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

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

  • 考虑第一个牌,发动的概率:1(1pi)r

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

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

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

  • P(i)=j=0rf[i1][j](1(1pi)rj)

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

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

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

  • 神题

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

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

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

  • 那么设 f[i] 为从还剩 i 个必须键到还剩 i1 个必须键的期望次数

f[i]=in×1+nin(f[i]+f[i+1]+1)

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

  • 答案就是 f[cnt]+f[cnt1]+...+f[k+1]

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

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

P3412 仓鼠找sugar II

  • 首先定一个根

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

f[i]=1degi(v(1+f[v]+f[u])+1)

f[i]=degi+vf[v]

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

g[i]=1degfa(1+(g[fa[i]]+1+g[i]+)+(fa[v]=fa[i],vi1+f[v]+g[i]))

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

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

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

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

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

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

P3232 [HNOI2013]游走

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

  • 那么对于一条边 (u,v) 期望经过的次数就是 fudu+fvdv

P1365 WJMZBMR打osu! / Easy

  • E(Fi)=E(Fi1+Δi)=E(Fi1)+E(Δi)

  • x 时,E(Δi)=0

  • o 时,假设之前的 o 的长度为 lenE(Δi)=E(2×len+1)=2×E(len)+1

  • ? 时,E(Δi)=0+2×E(len)+12

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

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

P3317 [SDOI2014]重建

  • 矩阵树定理实际上求的是 TeTpe

  • 这个题求的是 TeTpee(1pe)eT(1pe)

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

P3830 [SHOI2012]随机树

  • 第一问好说

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

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

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

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

f[i][j]=k=0i(f[k][j1]+f[nk][j1]f[k][j1]f[nk][j1])

P4562 [JXOI2018]游戏

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

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

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

P4206 [NOI2005] 聪聪与可可

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

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

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

  • 总的复杂度是 O(n2)

P6046 纯粹容器

  • E(i)=xP[tix]

  • 考虑第 xi 仍然存活的概率

  • 我们将每次操作看成一种合并的话,总的方案数就是 x!(n1x)

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

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

  • prei 都被选的概率为 P(A) ,设 inxt 的概率是 P(B)

  • 那么 P[tix]=1P(A)P(B)+P(AB)

P5575 [CmdOI2019]黑白图

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

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

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

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

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

E((x+1)k)=E(i=0k(ki)xi)=E((k0)x0)+E((k1)x1+...)

(k0)E(x0)+(k1)E(x1)+...

  • 所以我们需要维护 E(x),E(x1),...,E(xk)

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

  • f[u][p] 表示以 u 为节点期望下 xp 的和

  • 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(n2k2)

  • 还有优化成 O(nk3) ,这里就不说了

CF908D New Year and Arbitrary Arrangement

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

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

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

  • 因为是期望,考虑倒推

  • f[i][j] 表示前缀有 ia ,有 jab 期望的子序列个数

f[i][j]=A×f[i+1][j]+B×f[i][j+i]

  • 边界就是 j+ik ,此时就可以立刻停止了

  • i+jk 时,期望的子序列个数就是 i+j+papb

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

i=0xi=11x

i=0ixi=x(1x)2

CF804D Expected diameter of a tree

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

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

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

CF1151F Sonya and Informatics

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

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

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

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

  • 那么我们设 fi,j 表示第 i 轮前 x 个中有 j 个 0 的概率

  • 那么显然一个 j 只会和上一轮的 j1,j,j+1 有关

  • 观察到这个 n1e9 ,那么很明显要用到矩乘

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

posted @   Kzos_017  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示