CF605E Intergalaxy Trips 題解

下蛋爷發表於2024-07-27

Description

  • \(n\) 個點的有向完全圖。
  • \(i \to j\) 的邊每天出現的機率均為 \(p_{i,j}\),若 \(i = j\),有 \(p_{i,j} = 1\)
  • 每天可以選擇一條存在的出邊走過去或停留在原地不動。
  • 求最優策略下從 \(1\)\(n\) 的期望天數。
  • \(n \le 10^3\)

Solution

\(f_i\) 表示 \(i\)\(n\) 的期望天數。

假設 \(f\) 已經求出,那麼 \(i\) 每次走到的下一步 \(j\) 一定是滿足 \(i\to j\) 這條邊出現且 \(f_j\) 最小的點。

容易發現如果 \(f_j>f_i\)\(i\) 下一步無論如何不會走到 \(j\)

所以可以得出轉移方程:

\[f_i=\sum_{f_j<f_i}p_{i,j}f_j\prod_{f_k<f_j}(1-p_{i,k})+f_i\prod_{f_j<f_i}(1-p_{i,j})+1 \]

移項可得:

\[f_i=\frac{\sum_{f_j<f_i}p_{i,j}f_j\prod_{f_k<f_j}{(1-p_{i,k})}}{1-\prod_{f_j<f_i}(1-p_{i,j})} \]

考慮已經確定了前 \(k\) 小的 \(f\) 值,如何求出第 \(k+1\) 小的編號。

注意到只考慮前 \(k\) 小的貢獻,對於一個沒確定的 \(i\),再計算一個 \(f_j<f_i\)\(i\) 貢獻後 \(f_i\) 一定不會變大,所以如果當前 \(f_i<f_j\),則 \(i\) 一定不會在 \(j\) 後面,否則 \(f_i\) 計算 \(f_j\) 的貢獻後只會更小,與 \(i\)\(j\) 後矛盾。

所以第 \(k+1\) 小的編號就是隻考慮前 \(k\) 小的貢獻的沒確定的位置裡 \(f\) 值最小的編號。

時間複雜度:\(O(n^2)\)

Code