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