不知道原题解在说什么?结果发现这不就一简单题,改题的难度在于题解。


定义一个状态二元组 \((i,j)\) 表示当前栈顶书本大小为 \(i\),书本厚度和为 \(j\)

\(nxt(i,j)\) 为在 \((i,j)\) 状态时加入一本书的状态的可重集。容易发现所有状态构成一棵树。

\(F=\sum\limits_{t\in nxt(s)} f_s,G=\sum\limits_{t\in nxt(s)} g_s\)


定义 \(g_{i,j}\) 表示在状态 \((i,j)\) 时,之后有多少的概率在 \((i,j)\) 处进行一次弹栈操作。

\(j>w\)\(g_{i,j}=0\);否则设有 \(c\) 个书本大小比 \(i\) 小,记 \(s=(i,j)\),则:

\[\begin{aligned} g_s&=\dfrac{1}{c+1} + \dfrac{1}{c+1}\sum\limits_{t\in nxt(s)} g_tg_s \\ g_s&=\dfrac{1}{c+1} + \dfrac{G}{c+1}g_s \\ g_s&=\dfrac{1}{c+1-G} \end{aligned} \]

实际意义比较简单,就是考虑进到某个儿子中还有多少概率弹栈回来。


定义 \(f_{i,j}\) 表示在状态 \((i,j)\) 时,离开以 \((i,j)\) 为根的状态树的子树的期望步数,答案就是 \(f_{\infty,0}\)

\(j>w\)\(f_{i,j}=0\);否则设有 \(c\) 个书本大小比 \(i\) 小,记 \(s=(i,j)\),则:

\[\begin{aligned} f_s&=1+\dfrac{1}{c+1}\times 0 + \dfrac{1}{c+1}\sum\limits_{t\in nxt(s)} (f_t+g_tf_s) \\ f_s&=1+\dfrac{F}{c+1}+\dfrac{G}{c+1}f_s \\ f_s&=\dfrac{c+1+F}{c+1-G} \end{aligned} \]

实际意义比较简单,就是如果弹栈了就离开子树了;否则进入到某个儿子后离开儿子子树需要 \(f_t\) 的代价,其中 \(g_t\) 的概率是通过弹栈回到了 \(s\) 状态。这里实际上 \(f_t\)\(g_t\) 不是独立的,但是根据期望的线性性是可以这样拆的。


题解中的 \(f\) 定义不同,我觉得它完全错。

题解最后几行把 \(c+1\) 当做 \(c\) 了。于是应当是

  • 将计数器加上 \(1+\dfrac{F}{c+1}\)

  • 期望随机次数是 \(w=1+(1-\dfrac{P+1}{c+1})w\) 解得 \(w=\dfrac{c+1}{P+1}\)

  • 期望值是 \((1+\dfrac{F}{c+1})\times\dfrac{c+1}{P+1}=\dfrac{c+1+F}{P+1}\)

posted @ 2025-02-24 19:59  int_R  阅读(48)  评论(1编辑  收藏  举报