EDPC B - Frog 2
カエル 2
考え方
前問と考え方自体はほぼ同じ。
「$2$ 通りのうち小さい方」が「最大 $K$ 通りの中での最小」に変更となるだけ。
問題は、もらう DP でも配る DP でも、実装方法を少し考えないといけない点。
もらう DP の場合、前問では最初の $2$ つを特別扱いしていた。
しかし、特別扱いする個数が $K$ 個と不確定になってはそうもいかない。
そのため、ループの範囲を max 関数などを使って工夫することになる。
配る DP の場合、大量のダミー足場を付けるなら、いくつ付ければ足りるのか考えなければならない。
また、(今回は影響がないが)メモリや計算時間も確認が必要になる。
あるいは、ダミー足場を用意せずにループをきっちり止めるとしても、止め方を考えなければならない。
いずれにせよ二重ループになるし、範囲外アクセスの慎重な対応が必要で、実装はちょっと大変。
計算量はどちらでも $O(NK)$ である。
解答に実際の経路まで必要になった場合、バックトレースでまた for ループをブン回すのは大変。
もらう DP で書いて、どこからのルートが採用されたのかもメモしておきたい。
入力例1での動作
入力を受け取る。
n: 5
k: 3
h: {10, 30, 40, 50, 20}
各足場までの最小コストを、前から順に求める。
まだ求めていない足場は、十分大きな値としておく。
最初は足場 $1$ だけを考える。
スタート地点なので、最小コストは $0$ である。
| 足場 | $1$ | $2$ | $3$ | $4$ | $5$ |
|---|---|---|---|---|---|
| 最小コスト | $0$ | $\infty$ | $\infty$ | $\infty$ | $\infty$ |
足場 $2$ へは、足場 $1$ から来るしかない。
移動コストは $|30-10|=20$ である。
よって、最小コストは $20$ となる。
足場 $3$ へは、足場 $1,2$ から来られる。
足場 $1$ から来る場合のコストは $0+|40-10|=30$ である。
足場 $2$ から来る場合のコストも $20+|40-30|=30$ である。
よって、最小コストは $30$ となる。
足場 $4$ へは、足場 $1,2,3$ から来られる。
足場 $1$ から来る場合のコストは $0+|50-10|=40$ である。
足場 $2$ から来る場合のコストも $20+|50-30|=40$ である。
足場 $3$ から来る場合のコストも $30+|50-40|=40$ である。
よって、足場 $4$ までの最小コストは $40$ となる。
ここまでの状態は次のようになる。
| 足場 | $1$ | $2$ | $3$ | $4$ | $5$ |
|---|---|---|---|---|---|
| 最小コスト | $0$ | $20$ | $30$ | $40$ | $\infty$ |
足場 $5$ へは、$K=3$ なので足場 $2,3,4$ から来られる。
足場 $2$ から来る場合のコストは $20+|20-30|=30$ である。
足場 $3$ から来る場合のコストは $30+|20-40|=50$ である。
足場 $4$ から来る場合のコストは $40+|20-50|=70$ である。
よって、足場 $5$ までの最小コストは $30$ となる。
| 足場 | $1$ | $2$ | $3$ | $4$ | $5$ |
|---|---|---|---|---|---|
| 最小コスト | $0$ | $20$ | $30$ | $40$ | $30$ |
最後の足場までの最小コスト $30$ が答え。
注意点
特になし。
別解
配る方式
各足場から、そこから $K$ 個先までの足場へ最小コストを配る形でも実装できる。
計算量は同じく $O(NK)$ である。