edu129E (倍增预处理优化dp)
E. Labyrinth Adventures
一道很不错的题,暴力的想法是对于每次询问,逐层 dp,状态转移非常显然。但这样做的复杂度是 \(O(nm)\)。
注意到每次只能在相邻层之间转移,对于任意两层之间的转移,我们可以利用倍增来高效实现。具体状态定义:
- \(dp_{l,x,0/1,0/1}\):从第 \(l\) 层的门 \(0/1\) 出发,到达第 \(l+2^{x}\) 层的门 \(0/1\) 的最短路。
这样,中间的转移过程就只需要跳 \(O(\log n)\) 次,总复杂度优化为了 \(O(n\log n + m\log n)\)。
倍增预处理以及倍增优化 dp 的细节见 code。

浙公网安备 33010602011771号