CodeQUEEN 2024 予選 (AtCoder Beginner Contest 358)
いつもよりF,Gが簡単め?(面倒くささは除いて)
最適な行動は、「始点からどこかのマスへ辿り着く」→「辿り着いたら、そこに留まり続ける」となる。
留まるマスを $T$ とする。$T$ は、$S$ から $T$ に行くのに経由したマスの中で、$A_{i,j}$ が単独最大のマスであるとしてよい。
($T$ の他に最大マスがある場合、代わりにそこで留まり続けて損しない)
また、$S$ から $T$ に行く過程の途中で留まったり、同じマスを2度通ったりする必要も無い。(その分、速く $T$ に着いて留まる回数を多くした方がいい)
当然、$A_{i,j}$ が大きいマスを $T$ とした方がよいが、 遠くにはるばる行くより近場のマスを選んだ方が $K$ によっては最善となることもある。
S 9 1 ... 1 10に辿り着くために1の海をはるばる泳ぐより、 1 1 1 1 9で留まった方がよいこともある。 : : 1 1 1 ... 10
また、途中の経路も、速く着いた方が長く $T$ に留まれるが、 少し迂回して $A_{i,j}$ が大きいマスを経由した方がよい場合もある。
S 9 9 最短で下に行くより 9 を拾っていった方がいい 1 1 9 10 9 9
このために、$S$ から単なるコストや移動回数を持った経路探索をしても、上手く最適を求められない。
制約から $O(H^2W^2)$ が間に合いそうなので、 「$T$ を全探索」→「$T$ を固定した条件でグリッド探索」してもよい、ということになる。
$T$ マスに書かれた値を $A_T$ とする。
仮に「$K$ 回全てで $A_T$ を得られた」とすると総計は $KA_T$ で、これをまず貰っておく。
実際には辿り着くまでに踏む各マス $(i,j)$ に対し、$A_T-A_{i,j}$ だけ減少する。
これをコストとして、$S$ から $T$ までDijkstraをすると、$T$ を固定した場合の答えが求まる。
前述の通り、探索するマスは $A_{i,j} \lt A_T$ であるマスのみとしてよいので、コストは常に非負である。
どこに $T$ を設定しようと、また、$S$ からどんなルートを辿ろうと、$HW$ 回以内には必ず、最適なルートで $T$ に辿り着いている。
として、$k \le HW ( \le 2500)$ までの範囲を探索すれば、それぞれの状況からさらに $(i,j)$ に $K-k$ 回留まり続けた中での最大値が答えとなる。
同じマスを2回経由するルートなども探索されてしまうが、考え方はシンプルになる。