目次

CodeQUEEN 2024 予選 (AtCoder Beginner Contest 358) G問題メモ

CodeQUEEN 2024 予選 (AtCoder Beginner Contest 358)

いつもよりF,Gが簡単め?(面倒くささは除いて)

G - AtCoder Tour

G - AtCoder Tour

問題文

制約

解法

最適な行動は、「始点からどこかのマスへ辿り着く」→「辿り着いたら、そこに留まり続ける」となる。

留まるマスを $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$ であるマスのみとしてよいので、コストは常に非負である。

Python3

解法2

どこに $T$ を設定しようと、また、$S$ からどんなルートを辿ろうと、$HW$ 回以内には必ず、最適なルートで $T$ に辿り着いている。

として、$k \le HW ( \le 2500)$ までの範囲を探索すれば、それぞれの状況からさらに $(i,j)$ に $K-k$ 回留まり続けた中での最大値が答えとなる。

同じマスを2回経由するルートなども探索されてしまうが、考え方はシンプルになる。