ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

AOJ 2254 - 最短ルート

問題
提出コード

解法

制約を見ればbitDPと書いてあるのでbitDPをすることにします。
まず、i番のステージをクリアした後に、再びi番目のステージを行くことは考えなくていいです。2回以上同じステージに行くことで得をすることはありません。
ということで、すでにクリアしたステージをビットで持つことを考えます。
クリアしたステージの集合をSとします。

  • dp[S] = 現在クリアしたステージがSの状態のときに、ここからすべてのステージをクリアするまでにかかる時間の最小値

とします。初期値はdp[S_{all}] = 0、すなわち全てのステージをクリアした際、それ以降かかる時間は0ということです。
dp[S]を埋めることを考えると、この状態から次に選ぶステージは、Sの段階でまだビットが立っていないステージです。
そして、選べる装備は、すでにクリアステージのものなので、Sの段階でビットが立っているステージ、もしくは装備なしです。
ということで、
dp[S] = min(dp[\{S+i\}]+ t_{ij} ) (ただし、  i \not\in S , j \in {0,S} )
となります。
あとはこれを計算すれば、dp[\varepsilon ]、つまりまだ何もステージをクリアしていないときにかかる時間の最小値を参照すれば答えとなります。

感想

bitDPの解説を書く際、どのような表記がいいのかよくわからないです。状態を表しているので集合で表記してみたのですが、これはこれで小難しい感じがします(ただ、遷移の部分を2進数で書くとごちゃごちゃしてしまうので、それはそれで微妙です)。