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