Dungeon Attack (Hard)

2 secs 1024 MB
magurofly's icon magurofly

解説

DP の遷移は行列として表すことができ、行列累乗によって解くことができます。

このとき、通常の行列とは違い、和を max\max 、積を ++ として定義します。これは半環になるため行列の形で計算できます。

時刻 tt のときの頂点 vv のスコアを StvS_{tv} とすると、遷移行列 AA を使って次のように表すことができます。

[St1 St2  StN]=At[S01 S02  S0N]\begin{bmatrix} S_{t1} \\\ S_{t2} \\\ \vdots \\\ S_{tN} \end{bmatrix} = A^t \begin{bmatrix} S_{01} \\\ S_{02} \\\ \vdots \\\ S_{0N} \end{bmatrix}

初期値は S01=1,S0v=(2vN)S_{01} = 1,\quad S_{0v} = -\infty \quad (2 \le v \le N) となります。

遷移行列 AA は以下のように定義されます。

Aii=0A_{ii} = 0 : これは時間が経った時同じ頂点にとどまってもいいからです。

ABiAi=CiA_{B_i A_i} = C_i : これは辺による移動です。

答えは STNS_{TN} となるため、 O(N3logT)O(N^3 \log T) で解くことができました。

……行列累乗するには少し NN が大きすぎたので、反省です。