ツバサの備忘録

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

Educational DP Contest / DP まとめコンテスト O - Matching

問題
提出コード(1)
提出コード(2)

解法

bitDPです。
dp[i][S_{now}] = i番目までの男子に対してペアを作成し終えた段階で、残っている女子の状態がS_{now}の際の組み合わせの数
とします。
とりあえず、女子全員が残っている状態をS_{all}とします。
1人目の男子に対してペアを組める女子を1人選び、S_{all}から除外した状態をS_1とすると、初期状態はdp[1][S_1] = 1です。これは1人目の男子と相性がいい女子全員が対象です。
dp[i][S_{now}]の求め方について考えていきます。
i人目までのペアを作成し終えているので、i人目は、S_{now}以外の女子の誰かとペアを組んでいるはずです。その女子を含んだ、1つ前の状態をS_{before}とすると、
dp[i][S_{now}] = \sum dp[i-1][S_{before}]
となります。

感想

bitDPの解説、難しいと思います(1<<nみたいなのを書いたほうがわかりやすいかもですね)
今回はTLEが怖くて、ビットの部分集合を列挙する方法(提出コード2です)を使ったんですが、終わってから計算しなおしてみたら、その必要はなかったです(しかも実行時間あんまり変わりませんでした)。 思考の流れとしては、まず制約が明らかにビットを使ってください、と言っているようなものなので、そこに目を付けました。男女共にビットを使うと、当たり前ですが時間内に解くことができないので、片方だけビットを使ってうまく解く方法を考えることになります。すると、1人の男子に対する女子の選び方はたかだかN通りなので、あとは選んだ後の女子の状態を一緒に持てば解けるだろう、という感じになります。