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