九州大学プログラミングコンテスト2018 F - Team Making
解法
制約にbitDPをしてくださいと書いてあります。
ので、実際にbitDPを考えてみます。
- 今チームを組み終わっている人の状態がであるときの、これ以降のチームの組み方
とすると、まだチームを組めていない人の中で組めるようなチームの集合をとして、
という遷移をしたくなりますが、これでは重複部分が存在してしまいます。
例えば、
のようなパターンだと、上の遷移を行うことで、
先に1人目だけの1人のチームを組んでから、2人目だけのチームを作成
先に2人目だけの1人のチームを組んでから、1人目だけのチームを作成
というような、選ぶ順序を逆にしただけのものを区別することになります。
これを避けるために、まだ選んでいない人のうち、最も番号が若い人を確実に選ぶ、という制約を加えてあげると、うまく重複なく数え上げることができます。上の具体例では、前者だけがピックアップされます。
ということで、
を、改めて
- に含まれていない人の中で、最も番号が若い人を必ず含むようなチームの組み方の集合
と定義しなおすことで、
という遷移でこの問題を解くことができるようになります。
1人チームは、その人のレートがを超えていようがいまいがチームを組めることに注意してください。
初期化はで(は全ての人を含んだ状態)、答えは (は空集合、すなわち誰も含まれていない状態)を見ればよいです。
感想
左側を固定する方法、どこかで見たような気がするのですが思いつきませんでした...
個人的にやっぱりbitDPは再帰の方が理解しやすいです。