ツバサの備忘録

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

ABC142 E - Get Everything

問題
提出コード

解法

制約がbitDPをしろと言っているので、bitDPをします。
dp[S] = 現在開けた宝箱の状態がSのときに、そこからかかる費用の最小値
とします。
Sを整数型の変数1つで表し、2進数の桁に宝を割り振り、0:まだ開いていない、1:開いている、とすると
初期値はdp[2^{N}-1] = 0で、答えはdp[0]です。
dp[S]を求めることについて考えると、
状態がSの際にi番目の鍵を使うと、S \cup T_{i} (ただし、T_{i}i番目の鍵を使用して開けることのできる宝箱の集合)
となります。
鍵はM種類あり、これを全部試せばよく、
dp[S] = min(dp[S \cup T_{i} ] +a_{i})
となります。S \cup T_{i} = Sのパターンは注意する必要があり、スルーしなければなりません。
あとはこれを繰り返せば答えが求まります。
O(2^{N}MN)なのですが、T_{i}を前計算してあげるとO(2^{N}M)になります(自分は前計算してないです)

感想

久々にbitDPを見た気がします…
やっぱりbitDPに関しては再帰で書くのが個人的には好きです