CF605E Intergalaxy Trips 题解

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


posted @ 2024-07-27 16:15  下蛋爷  阅读(3)  评论(0编辑  收藏  举报