概率论做题笔记

概率论 做题笔记

本文章写作时间大约为 2024 年 6 月。

  1. CF1948 Rare Coins

    \(\operatorname{val}(n)\) 表示 \(n\) 个银币的价值(注意这是一个随机变量),可以把问题化归成:求

    \[P(\operatorname{val}(x) > \operatorname{val}(y) + k) \]

    首先考虑 \(\operatorname{val}(n)\) 恰为某个定值 \(a\) 的概率:\(n\) 个银币,每种银币有两种可能的状态,总状态数为 \(2^n\);其中恰有 \(a\) 个银币价值为 \(1\),方案数为 \(C_{n}^{a}\),即\(P(\operatorname{val}(n) = a) = \dfrac{C_n^a}{2^n}\)

    因为 \(\operatorname{val}(x)\)\(\operatorname{val}(y)\) 都不是定值,一个自然的想法是:先固定其中一个随机变量的值(这里固定 \(\operatorname{val}(y)\)),然后计算此情况下不等式成立的概率。因为 \(\operatorname{val}(y) \in [0, y]\),所以

    \[ans = \sum_{p = 0}^{y} P(\operatorname{val}(y) = p) \times P(\operatorname{val}(x) > p + k) \]

    现在式子已经推出来了,但是!!!这个式子带有组合数,如果每次单独计算,肯定会 T;而又因为组合数的底数不确定,所以也无法预处理。

    这里有一个非常妙的处理:把 \(\operatorname{val}(n)\) 看作 \(n\) 个相同随机变量的和,这个随机变量等概率取到 \(0\)\(1\),这里用 \(\operatorname{rand}(0, 1)\) 表示。于是 \(\operatorname{val}(n) = \sum_{i-1}^n \operatorname{rand}(0, 1)\)

    关键的地方来了:\(\operatorname{rand}(0, 1) = 1 - \operatorname{rand}(0, 1)\)。这个式子带有随机变量,所以我们应该审视一下这个式子中等于号究竟代表什么。首先,等号左边是一个随机变量,它有 \(\frac{1}{2}\) 的概率取 \(0\),有 \(\frac{1}{2}\) 的概率取 \(1\),这是很清晰的。而如果把等号右边的 \(1 - \operatorname{rand}(0, 1)\) 整体看作一个随机变量,会发现:它同样有 \(\frac{1}{2}\) 的概率取 \(0\),有 \(\frac{1}{2}\) 的概率取 \(1\)如果两个随机变量取值的集合相同,取到集合中任意一个值的概率也相同,这两个随机变量岂不是毫无区别?这正是这里等号的含义。

    接下来事情就好办了:把原不等式移项,得到 \(\operatorname{val}(x) - \operatorname{val}(y) > k\)。把 \(\operatorname{val}(x)\)\(\operatorname{val}(y)\) 拆成随机变量之和的形式,则不等式左边

    \[\begin{aligned} \operatorname{val}(x) - \operatorname{val}(y) & = \sum_{i = 1}^{x} \operatorname{rand}(0, 1) - \sum_{i = 1}^{y} \operatorname{rand}(0, 1) \\ & = \sum_{i = 1}^{x} \operatorname{rand}(0, 1) - \sum_{i = 1}^{y} (1 - \operatorname{rand}(0, 1)) \\ & = \sum_{i = 1}^{x} \operatorname{rand}(0, 1) + \sum_{i = 1}^{y} \operatorname{rand}(0, 1) - y \\ & = \sum_{i = 1}^{x + y} \operatorname{rand}(0, 1) - y \\ & = \operatorname{val}(x + y) - y \end{aligned} \]

    那么我们就是要求 \(P(\operatorname{val}(x + y) > y + k)\)。而 \(x + y\)​​ 正是所有袋子中银币的总数,是一个定值,所以可以预处理它的组合数。可做!\(\square\)

  2. P3802 小魔女帕琪

    (条件概率的应用)

    (下面令 \(n = \sum_{i=1}^7 a_i\),即晶体总数)

    原题目太难了,我们一步一步来。我们遵循以下的步骤:

    要求总释放次数的期望?——先求每一步释放次数的期望,每步释放的期望之和正是总期望(期望的线性性)

    要求每一步释放次数的期望?——每一步要么释放 \(1\) 次,要么释放 \(0\) 次。用 \(X_i\) 表示第 \(i\) 步的释放次数,\(A_i\) 表示第 \(i\) 步释放这个事件,则 \(E(X_i) = 1 \times P(A_i) + 0 \times P(\overline{A_i}) = P(A_i)\),所以我们需要求出每一步释放七重奏的概率。

    要求每一步释放的概率?——我们可以从第 \(7\) 步着手,这是第一次可能释放七重奏的尝试。

    要求第 \(7\) 步释放的概率?——第 \(7\) 步释放七重奏,实际上有很多种可能,因为前 \(7\) 步取出 \(1 \sim 7\) 的任意一种排列都会导致释放七重奏。不妨考虑取出某个特定排列的概率——\((1, 2, 3, 4, 5, 6, 7)\) 这个排列就很适合。

    要求前七步取出 \((1, 2, 3, 4, 5, 6, 7)\) 的概率,可以这样考虑:第一步取出 \(1\) 的概率显然是 \(\dfrac{a_1}{n}\)在第一步取出 \(1\) 的情况下,第二步取出 \(2\) 的概率是 \(\dfrac{a_2}{n-1}\)(注意,第二次取晶体时,晶体的总数比原来减少了 \(1\))。所以,第一步取出 \(1\) 第二步取出 \(2\) 的概率为 \(\dfrac{a_1 a_2}{n(n-1)}\)。注意这里使用了条件概率,并且运用了 \(P(A \cap B) = P(A) \times P(A|B)\),其中 \(B = 第一次取出 1, A = 第二次取出 2\)。同理可以推出后面几步取出对应晶体的条件概率,这些事件(即每一步都取到了对应晶体)同时发生的概率即为 \(\dfrac{a_1 a_2 \cdots a_7}{n(n-1) \cdots (n-6)}\)

    上面考虑的是前七步取出某种特定排列的概率。显然,取出其它任意排列的概率也是相同的,而排列的总数有 \(7!\) 种,所以前七步取出某种排列(也就是第七步释放七重奏)的概率为 \(7! \times \dfrac{a_1 a_2 \cdots a_7}{n(n-1) \cdots (n-6)}\)

    那么第 \(7\) 步以后的每一步,释放七重奏的概率是多少呢?先考虑第 \(8\) 步。不失一般性,假设第一步取出了 \(1\),那么第 \(2 \sim 8\) 步取出某种排列的概率就是 \(7! \times \dfrac{(a_1 - 1)a_2 a_3 \cdots a_7}{(n-1)(n-2) \cdots (n-7)}\)(注意这是条件概率!)。而第一步取出 \(1\) 的概率是 \(\dfrac{a_1}{n}\),所以第一步取出 \(1\) \(2 \sim 8\) 步取出某种排列的概率就是上面这两个概率的乘积,也即 \(\dfrac{a_1}{n} \times \dfrac{(a_1 - 1)a_2 a_3 \cdots a_7}{(n-1)(n-2) \cdots (n-7)} \times 7! = (a_1 - 1) \times \dfrac{a_1 a_2 \cdots a_7}{n(n-1)(n-2) \cdots (n-7)} \times 7!\)​。

    同理可得,第一步取出 \(i\) \(2 \sim 8\) 步取出某种排列的概率为 \((a_i - 1) \times \dfrac{a_1 a_2 \cdots a_7}{n(n-1)(n-2) \cdots (n-7)} \times 7!\)

    综上所述,第 \(2 \sim 8\) 步取出某种排列的概率就是以上概率的和,即

    \[\begin{aligned} & \sum_{i=1}^7 (a_i-1) \times \dfrac{a_1 a_2 \cdots a_7}{n(n-1)(n-2) \cdots (n-7)} \times 7! \\ & = (n-7) \times \dfrac{a_1 a_2 \cdots a_7}{n(n-1)(n-2) \cdots (n-7)} \times 7! \\ & = \dfrac{a_1 a_2 \cdots a_7}{n(n-1) \cdots (n-6)} \end{aligned} \]

    (这几项概率可以相加,运用到了划分的知识)

    而这个概率正和在第 \(7\) 步释放七重奏的概率相等。也就是说:取出任意一个晶体,并不会改变之后的第 \(7\) 步释放七重奏的概率。同理可得,\(7 \sim n\) 步中每一步释放七重奏的概率相等。总的期望释放次数就是这些所有概率之和,即 \((n-6) \times \dfrac{a_1 a_2 \cdots a_7}{n(n-1) \cdots (n-6)} = \dfrac{a_1 a_2 \cdots a_7}{n(n-1) \cdots (n-5)}\)\(\square\)

  3. P1297 单选错位

    最简单的一集。

    注意到这道题的关键是不同题目的选项个数可能不相同

    \(i\) 道题目的答案来自于第 \(i-1\) 道题。

    1. 假设 \(a_i \ge a_{i-1}\),我们按两步来计算:第一,第 \(i\) 题答案编号恰好在 \([1, a_{i-1}]\) 内的概率为 \(\dfrac{a_{i-1}}{a_i}\);第二,在上一步发生的条件下(又用到了条件概率),第 \(i\) 题答案恰好是 \(i-1\) 题答案的概率为 \(\dfrac{1}{a_{i-1}}\)。这两件事都发生的概率就是 \(\dfrac{a_{i-1}}{a_i} \times \dfrac{1}{a_{i-1}} = \dfrac{1}{a_i}\)
    2. 假设 \(a_i < a_{i-1}\),仍按两步计算:第一,第 \(i-1\) 题答案编号恰好在 \([1, a_i]\) 内的概率为 \(\dfrac{a_i}{a_{i-1}}\);第二,在上一步发生的条件下,第 \(i\) 题答案恰好是 \(i-1\) 题答案的概率为 \(\dfrac{1}{a_i}\)。这两件事都发生的概率为 \(\dfrac{a_i}{a_{i-1}} \times \dfrac{1}{a_i} = \dfrac{1}{a_{i-1}}\)

    综上所述,第 \(i\) 题选择正确的概率为 \(\dfrac{1}{\max(a_i, a_{i-1})}\)。总的期望正确回答数为 \(\sum_{i=1}^n \dfrac{1}{\max(a_i, a_{i-1})}\)。(这里先运用了每一题期望正确数就等于这道题正确的概率,然后又运用了期望的线性性。)(又,特别地,第 \(1\) 题的答案是从第 \(n\) 题抄来的,需要特判一下。)\(\square\)

  4. CF148D Bag of mice

    \(f_{i,j}\) 表示有 \(i\) 只白鼠,\(j\) 只黑鼠时,轮到 A 取,A 赢的概率。

    这里的一个要点时要把每个回合看作一个整体来考虑,所以设计状态时 \(f_{i,j}\) 代表轮到 A 取时 A 赢的概率。这样设计可以方便转移。

    每个回合抓鼠的情况有且仅有以下几种(先假设黑白鼠的数量都是足够的):

    1. A 抓到白鼠,此时 A 赢。这种概率是 \(p_1 = i/(i+j)\)
    2. A 抓到黑鼠,B 抓黑跑黑。这种概率是 \(p_2' = j/(i+j) \times (j-1)/(i+j-1) \times (j-2)/(i+j-2)\)。这个回合之后还剩 \(i\) 只白鼠和 \(j-3\) 只黑鼠,这种情况下 A 赢的概率是 \(f_{i,j-3}\)(条件概率!)。再乘上这回合这种抓鼠情况发生的概率,A 通过这种方式赢的概率有 \(p_2 = p_2' \times f_{i,j-3}\)
    3. A 抓到黑鼠,B 抓黑跑白。仿照第 2 种情况的分析方法,可以得到 A 通过这种方式赢的概率为 \(p_3 = j/(i+j) \times (j-1)/(i+j-1) \times i/(i+j-2) \times f_{i-1,j-2}\)
    4. A 抓到黑鼠,B 抓到白鼠。此时 A 输。

    转移方程这就列完了,但思考一下它在概率上的意义还是有益的。把“A 赢”看作一个事件,这个事件可以看作三个互斥事件的并:“在第一回合,A 抓到白鼠”,“在第一回合,A 抓黑,B 抓黑跑黑,A 在以后的回合中取胜”,“在第一回合,在第一回合,A 抓黑,B 抓黑跑白,A 在以后的回合中取胜”。由于是互斥事件,所以它们并的概率可以直接用它们的概率之和来表达。这也就从概率论的视角严谨地说明了为什么这个转移方程是正确的。

    在代码实现上,本题的初始化值得注意。

  5. P4316 绿豆蛙的归宿

    \(f_u\) 表示从起点到达点 \(u\) 的路径期望长度,\(p_u\) 表示从起点到达点 \(u\)​ 的概率。

    先考虑这样的问题:有 \(k\) 种方式完成任务,使用第 \(i\) 种方式的期望代价是 \(E_i\),概率是 \(p_i\),那么完成这个任务的期望代价 \(E\) 是多少?

    不难得出 \(E = \sum_{i=1}^{k} p_i \cdot E_i\)

    回到这个问题,若已知 \(u\) 的所有前驱的 \(p\)\(f\),如何计算 \(p_u\)\(f_u\)?根据加法原理,不难得到 \(p_u = \sum_{v \in pre(u)} p_v\)。而计算 \(f_u\) 就要用到上文提到的那个结论了。这里容易出错的是认为 \(f_u = \sum_{v \in pre(u)} p_v \cdot (f_v + w(v, u))\),它错误的原因在于概率因子不应该是 \(p_v\)

    重新审视一下这个式子。\(p_v\) 代表从起点到达 \(v\) 的概率,而实际上我们需要的是在已知到达 \(u\) 的情况下(条件概率!),从 \((v,u)\) 这一条边过来的概率。我们用 \(P(v|u)\) 来体现条件概率,那么 \(f_u = \sum_{v \in pre(u)} P(v|u) \cdot (f_v + w(v, u))\)

    又不难得到 \(P(v|u) = \dfrac{P(到达v然后到达u)}{P(到达u)} = \dfrac{p_v / \operatorname{oud}(v)}{p_u}\),其中 \(\operatorname{oud}(v)\) 表示节点 \(v\) 的出度。此题也就做完了。\(\Box\)

  6. P1291 百事世界杯之旅

    做法1:

    \(f_i\) 表示买到 \(i\) 个不同名字的期望总天数, \(g_i\) 表示已有 \(i - 1\) 个不同名字,买到\(i\)(未拥有)名字的期望的额外天数。

    根据期望的可加性,有 \(f_i = f_{i-1} + g_i\),那如何计算 \(g_i\)​ 呢?

    我们套用期望的定义来计算:\(g_i\) 就等于

    \[\sum_{d=1}^{+\infty} d \cdot P(在第 d 天买到新名字) = \sum_{d=1}^{+\infty} d \cdot \left(\dfrac{i-1}{n}\right)^{d-1} \dfrac{n-i+1}{n} \]

    这个有无限项的和式无疑不能直接用来计算。下面运用一些数学技巧,尝试找出该式的一个封闭形式。

    为方便起见,设每天获得新名字的概率 \(\dfrac{n-i+1}{n} = p\)。则

    \[g_i = \sum_{d=1}^{+\infty} d \cdot (1-p)^{d-1} p \]

    \[(1-p)g_i = \sum_{d=1}^{+\infty} d \cdot (1-p)^{d} p \]

    所以

    \[g_i - (1-p)g_i = p \cdot g_i = \sum_{i=1}^{+\infty} (1-p)^{d-1} p \\ g_i = \sum_{i=1}^{+\infty} (1-p)^{d-1} = \sum_{i=0}^{+\infty} (1-p)^{d} \]

    (其中第一步的转化用了错位相减的手段。)

    由于 \(0 < 1-p < 1\),所以可以套用几何级数的求和公式 \(\sum_{i=1}^{+\infty} r^i = \dfrac{1}{1-r}\),得到

    \[g_i = \dfrac{1}{p} = \dfrac{n}{n-i+1} \]

    因此 \(f_n = \sum_{i=1}^{n} \dfrac{n}{n-i+1} = n \sum_{i=1}^{n} \dfrac{1}{n} = n H_n\),其中 \(H_n\) 代表调和级数。在这里我们得到了一个有趣的结论:对于这类抽取问题,抽到 \(n\) 个不相同物品的期望次数是调和级数前 \(n\) 项和的 \(n\) 倍。

    做法2:

    咕咕咕……

  7. CF453A

    最简单的一集。

    投掷 \(n\) 次骰子,总方案数为 \(m^n\)

    \(n\) 次骰子,最大值为 \(x\) 的方案数可以这么求:

    首先,每一次掷得的点数都要小于等于 \(x\),这种情况下有 \(x^n\) 种方案数。

    其次,\(x\) 这个点数必须要出现,否则它就不是最大值。我们转化成求 \(x\) 没有出现的方案数,这相当于每次投掷的结果都小于等于 \(x-1\),这种情况下有 \((x-1)^n\) 种方案数。

    相减,则掷 \(n\) 次骰子,最大值为 \(x\) 的方案数为 \(x^n - (x-1)^n\)

    因此,所求期望 \(E = \sum_{x=1}^{m} \dfrac{x^n - (x-1)^n}{m^n} \cdot x\)

    需要注意的是数据范围。题目没有要求取模,而要求输出小数。这样的话,上面这个式子无论用什么存都肯定爆了,因此需要转化一下,变成:

    \[E = \sum_{x=1}^m \left(\left(\dfrac{x}{m}\right)^n - \left( \dfrac{x-1}{m} \right)^n \right) \cdot x \]

    这样就可以存下了。

    (PS:做这道题时,我推出式子之后没想到怎么处理数据太大的问题,屈辱地看了题解,看完感觉自己真是完蛋了,这么简单的东西都想不到)

  8. P6862 [RC-03] 随机树生成器

    先考虑 \(k\) 节点的期望度数 \(E\)。易知 \(E - 1 = \sum_{i = k+1}^n \dfrac{1}{i-1}\)(这里减 \(1\) 是减去了父节点。特别地,如果 \(i=1\),那么就不用减去,因为 \(1\) 号节点没有父节点。这里不再特殊讨论这种情况,下同)。

    \(sum\) 表示题目要我们求的度数和,那么 \(E = \dfrac{sum}{(n-1)!}\)。联立二式,即可得到 \(sum\)

    这道题的启发性在于:平时我们都是用某个值的和除以总方案数来算期望,这里却正好相反:期望是易求的,因此我们可以用期望乘上总方案数来算要求的和。 \(\Box\)

  9. P5147 随机数生成器

    \(f_n = E(\operatorname{work}(n))\),则

    \[f_n = \begin{cases} 0, n = 1 \\ 1 + \dfrac{1}{n} \sum_{i=1}^{n} f_i, \text{Otherwise} \end{cases} \]

    转移成环,把 \(f_n\) 解出来,得到(省略 \(n=1\) 时的情况)

    \[f_n = \dfrac{n}{n-1} + \dfrac{1}{n-1} \sum_{i=1}^{n-1} f_i \]

    用前缀和加速转移,时间复杂度 \(O(n)\) ,可以得到 80 分

    考虑优化这个式子。这里利用增量的思想,计算相邻两项的差分(即 \(f_{n+1}\)\(f_n\)​ 的差值)。如果算出了差分,再做一次前缀和就得到了通项。具体地,设 \(D_i = f_{i+1} - f{i}\),那么 \(\sum_{i=2}^{n-1} D_i = D_n - D_1 = D_n\)

    \(nf_{n+1} = n + 1 + \sum_{i=1}^n f_i\)\((n-1)f_n = n + \sum_{i=1}^{n-1}f_i\)

    两式做差,得到 \(nf_{n+1} - (n-1)f_n = 1 + f_n\)

    移项整理,最终结果:\(f_{n+1} - f_n = \dfrac{1}{n}\)

    做一遍前缀和,就得到了 \(f_n\) 的通项公式:\(f_n = \sum_{i=1}^{n} \dfrac{1}{i}\),这也就是调和级数 \(H\)。而当 \(n\) 较大时,调和级数可以直接用这个公式计算:\(H_n = \ln n + \gamma\),其中 \(\gamma = 0.5772156 \cdots\)。 这样就可以用 \(O(1)\) 的时间解决本题。 \(\Box\)

  10. P1654 OSU!

    好题!但不得不说早期洛谷的题解质量是真的差,感觉没有一篇题解是讲的特别清楚的,我看了好久才搞懂。下面是我认为的一种更规范的解题过程

    首先,我们设随机变量 \(X_i\) 表示\(i\) 向左的极长 1 串的长度,并且对于任意的 \(i\),我们要想办法求出 \(E(X_i^3)\)。(需要注意的是 \(E(X^3) \not = (E(X))^3\)。更一般地说,\(E(f(X)) \not = f(E(X))\)。)但直接求是不好求的,我们先考虑求出 \(E(X_i)\)\(E(X_i^2)\)​。

    • \(E(X)\):如果第 \(i\) 位是 \(0\),那么 \(X_i = 0\);否则,“从 \(i\) 向左的极长 1 串的长度”就等于“从 \(i-1\) 向左的极长 1 串的长度”再加 \(1\),即 \(X_i = X_{i-1} + 1\)(当然 \(X_{i-1}\) 可以是 \(0\)。)。根据期望的可加性,就有 \(E(X_i) = (1-p_i) \cdot 0 + p_i \cdot (E(X_{i-1}) + 1) = p_i \cdot (E(X_{i-1}) + 1)\)。(这里第 \(i\) 位是 \(0\) 的情况并不对答案产生贡献,因为乘上了 \(0\),并且在 \(E(X^2)\)\(E(X^3)\) 的推导中也是如此,所以下面不再讨论这种情况。)其实这里的转移是较为明显的,但它运用的期望的重要性质——可加性将会在下面的推导中也用到,因此需要格外注意。

    • \(E(X^2)\):这里是重点。回忆一下,在上面的推导中,我们把 \(X_i\) 表示成了两部分:\(i\) 向左(不包含 \(i\))的部分——\(X_{i-1}\) 和第 \(i\) 位本身——\(1\)。能否把 \(X_i^2\) 也分成两部分表达?

      确实是可以的。因为已经假定了第 \(i\) 位是 \(1\),所以 \(X_i = X_{i-1} + 1\)。进一步地,\(X_i^2 = ((X_i - 1) + 1)^2 = (X_{i-1} + 1)^2 = X_{i-1}^2 + 2X_{i-1} + 1\)。这样就成功地用下标小于 \(i\) 的式子表达出了 \(X_i^2\)!再次利用期望的可加性,就有 \(E(X_i^2) = p_i \cdot(E(X_{i-1}^2) + 2E(X_{i-1}) + 1)\)

    • \(E(X^3)\):既然已经推导出了 \(E(X^2)\),那么这里也只需依葫芦画瓢了。

      因为 \(X_i^3 = (X_{i-1} + 1)^3 = X_{i-1}^3 + 3X_{i-1}^2 + 3X_{i-1} + 1\)

      根据期望的可加性,有 \(E(X_i^3) = p_i \cdot (E(X_{i-1}^3) + 3E(X_{i-1}^2) + 3E(X_{i-1}) + 1)\)

    到这里,本题的大部分推导都完成了,但仍没有结束。如果直接输出 \(E(X_n^3)\),那么是不对的,因为 \(E(X_n^3)\) 只表示从第 \(n\) 位向左这个串得到的分数,而不代表总分。

    \(Y_i\) 表示截至到第 \(i\) 位能得到的分数,那么

    • 如果第 \(i\) 位为 \(0\):显然 \(Y_i = Y_{i-1}\)
    • 如果第 \(i\) 位为 \(1\):这里,我们希望把 \(Y_i\) 表示成 \(Y_{i-1} + \Delta\) 的形式,其中 \(\Delta\) 表示在第 \(i\) 位的“得分增量”,它应该是 \(X_i^3 - X_{i-1}^3\)——这一部分之前已经推导过了,即 \(E(\Delta) = E(X_i^3 - X_{i-1}^3) = 3E(X_{i-1}^2) + 3E(X_{i-1}) + 1\)。代回,就得到了最终的式子:

    \[E(Y_i) = E(Y_{i-1}) + 3E(X_{i-1}^2) + 3E(X_{i-1}) + 1 \]

    输出答案为 \(E(Y_n)\)​。\(\Box\)

  11. P6835 [Cnoi2020] 线形生物

    初步想到设 \(f_i\) 表示从 \(1\) 号台阶走到 \(i\) 号台阶的期望步数(为了区分,下面记作 \(f_{1 \rightarrow i}\)),于是易得转移方程:

    \[f_{1 \rightarrow i} = \sum_{j \in \operatorname{next}(i)} \dfrac{1}{\operatorname{oud}(i)} \cdot (f_{1 \rightarrow j} + 1) \]

    其中 \(next(i)\) 表示图中 \(i\) 所有后继的集合,既包含 \(i+1\) 也包含 \(i\) 通过返祖边连向的节点。但需要注意的是,\(next(i)\) 同时包含了编号小于 \(i\) 和大于 \(i\) 的节点。换句话说,\(f_{1 \rightarrow i}\) 既和前面的状态有关,又和后面的状态有关,因此找不到一个合适的转移顺序。如果喊高斯来消元,时间复杂度又无法接受。那怎么办呢?

    这时应该想到改变状态的定义。一个常见的套路是(在下面的分手是祝愿一题中也会出现),设 \(f_{i \rightarrow i+1}\) 表示从 \(i\) 号台阶走到 \(i+1\) 号台阶的期望步数,于是我们要求的 \(f_{1 \rightarrow n+1} = \sum_{i=1}^{n} f_{i \rightarrow i+1}\)

    重新推导一遍转移方程,得到:

    \[f_{i \rightarrow i+1} = \dfrac{1}{\operatorname{oud}(i)} \cdot 1 + \sum_{j \in next(i) \land j \not = i+1} \dfrac{1}{\operatorname{oud}(1)} \cdot(f_{j \rightarrow i+1} + 1) \]

    这里继续活用了 \(f\) 的下标:\(f_{x \rightarrow y}\) 表示从 \(x\)\(y\) 的期望花费。显然 \(f_{x \rightarrow y} = f_{1 \rightarrow y} - f_{1 \rightarrow x}\),因此可以转移时记录一下 \(f_{1 \rightarrow i}\),上式整理得:

    \[\begin{aligned} f_{i \rightarrow i+1} & = \operatorname{oud}(i) + \sum_{j \in \operatorname{next}(i) \land j \not = i+1} f_{j \rightarrow i} \\ & = \operatorname{oud}(i) + \sum_{j \in \operatorname{next}(i) \land j \not = i+1} (f_{1 \rightarrow i} - f_{1 \rightarrow j}) \end{aligned} \]

    这样就做到了线性转移。

    梳理一下做题过程:我们一开始就容易想出某种状态设计和转移方程,但这种解法并不优,其原因当前状态既和过去的状态有关,又和将来的状态有关,在子问题图中体现为转移成环。而且,转移形成的不是以往常见的自环,这就不能通过简单移项来消除环,而只能高斯消元,这样做的时间复杂度又是无法接受的,这就驱使我们改变状态设计。实际上,新的状态设计利用了题目的一个较好的性质:虽然在图中行走,一次可能后退好几个节点,但只要前进,一次一定只前进一个节点。正是这种性质,才方便了我们新的状态设计和转移。\(\Box\)

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

posted @ 2025-07-02 15:40  DengStar  阅读(39)  评论(0)    收藏  举报