スタートとゴールの vertex を \(0\), それ以外の vertex を \(1, \cdots , N-1\) として, \(N\) 個の頂点で書き直したバージョンで説明する. \(d_{i,i+1}\) を \(i\) から \(i+1\) への距離とおく.
解法 0: Segtree
まず簡単なバージョンの問題を考える.
Eary: プレゼントの制限無し
プレゼントを無限に持てるという場合は, 0 に戻る必要がない. よって,\(i \rightarrow i+1\) の距離 \(d_{i,i+1}\) の和が答え.
Normal: プレゼントの制限有り
何回か vertex \(0\) へ戻らないといけないとする. 戻らないといけない具体的な条件は,一旦無視する. この場合,\(i \rightarrow i+1\) への移動をする際に, 補給するために \(0\) を経由する選択肢が生まれる. つまり,\(i \rightarrow i+1\) と \(i \rightarrow 0 \rightarrow i+1\) の 二つの選択肢がある. よって Normal の問は,各 \(i\) に対してどちらの選択をするのが 最善かを選ぶというものに言い換えられる.
ここで,\(0\) を経由する度にかかるコスト \(f_{i} := d{i,0} + d{0,i+1} - d_{i,i+1} \geq 0\) を定義する. Noraml の問は,\(f_{i}\) の和が最小になるように選ぶという問になる.
Hard(本問)
\(K\) 個までしかプレゼントを持てないとする. このとき,何度か vertex \(0\) へ戻らないといけない. \(f_{i}\) の和が最小になるように \(i\) を選ぶのは同じだが, 以下の条件を追加する:
選んだ \(i\) の集合を \(I\) とおく.
DP でこの問題を解く. \(i \in [0,N]\) に対して,
とおく. 遷移と初期化は
\(dp_{0} = 0\)
となる. 求める答えは \(ans = \sum_{i \in [0,N]} dp_{i,i+1} + dp_{N}\). 遷移は区間 min なので,segtree を用いて \(O(log N)\) で遷移出来る.
解法 1: Lazy segtree
解法 2: Slide min
実装
使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"