Educational DP Contest / DP まとめコンテスト U - Grouping
解法
制約から見てbitDPです。
- 現在グループを組めていないウサギの状態がのときに、それ以降のグループ分けで得ることができる得点の最大値
とします。すると、の部分集合を用いて、
と書くことができます。
ただし、は、というグループを作成したときに得られる得点です。これは、前計算によってで計算できます。
先ほどのDPの遷移の計算量を見積もってみます。
ある集合について、残っているウサギの数をと表現すると、部分集合は通りあります。
残っているウサギの数がとなるような集合の選び方はです。ここで、本来はが0となるような選び方をしないのですが、計算をしやすくするために0も選ぶことができるとすると、がからまであり得ることに注意して、
となり、これは
であり、結局二項定理の式そのものなので、
となります。
ということで、最初のDPの遷移はで計算できるということがわかりました。
あとは、前計算とDPの遷移を行うことで、を見れば答えがわかります(は全てのウサギが入っている状態です)。初期状態は、ウサギが1羽の任意の集合に対して、です。
の部分集合列挙は、
for(int b = S; b > 0; --b &= S){ hoge; }
という感じでやるとできます。
桁が下の方から削除していくイメージです。
感想
だいぶ前に考察だけ終わらせておいて放置していた問題でした…
bitDPなのでやりたいことはほぼ覚えてました。一見になりそうで、きちんと計算すると計算量が減るタイプの問題ですね。