問題
$ N $ 個の部屋があり、$ 1 $ から $ N $ までの番号が付けられています。
この部屋はすべて一方通行であり、通路を介して1つ先または2つ先の部屋に移動できます。
各通路における移動時間は以下の通りです。
🔹部屋 $ i - 1 $ から部屋 $ i $ に向かう通路を通るのに $ A_i $ 分 $ (2 \leqq i \leqq N) $ かかる
🔹部屋 $ i - 2 $ から部屋 $ i $ に向かう通路を通るのに $ B_i $ 分 $ (3 \leqq i \leqq N) $ かかる
部屋 $ 1 $ から部屋 $ N $ に移動するのに、最短時間のルートを1つ出力して下さい。
[制約]
🔹$ 3 \leqq n \leqq 100000 $
🔹$ 1 \leqq A_i \leqq 100 (2 \leqq i \leqq N) $
🔹$ 1 \leqq B_i \leqq 100 (3 \leqq i \leqq N) $
解き方・ソースコード
前々回の記事では同じ問題の最短時間を求めましたが、今回は最短時間で移動する際のルート(経路)を求める問題となります。
この問題ではゴールから順番にスタートへの経路を考えることで解くことができます。
まずは、前々回記事と同様に動的計画法を使って最短時間を求めます。
この時に作成した $ dp $ を確認すると次のように最適解(最短時間となるルート)を求めることができます。
🔹$ dp[x] = dp[x-1] + A_x $ の場合:方法Aを選ぶ
🔹$ dp[x] = dp[x-2] + B_x $ の場合:方法Bを選ぶ
なお、上の2つの条件両方を満たす場合は、方法A・方法Bどちらを選んでも構いません。
最後に、復元した経路を逆順に並べ替えることにより、最短ルートを求めます。
[Google Colaboratory]
1 | #--------- 入力例 ---------- |
[実行結果(入力例1)]
[5] [5, 4] [5, 4, 2] [5, 4, 2, 1] 解: 1 → 2 → 4 → 5
最短時間にするためには1 → 2 → 4 → 5という経路であることが確認できました😊