Codeforces Round #490 (Div. 3) F. Cards and Joy
お題箱より。
問題概要
人のプレイヤーに
枚ずつのカードを配る。
枚のカードそれぞれにかかれている数字
と、プレイヤー
が好きな数字
が与えられる。
それぞれのプレイヤーは、配られたカードのうち好きな数字が書かれたものが 枚存在すると
の幸福度を得る。1枚も存在しない場合の幸福度は
である。
全プレイヤーの幸福度の総和の最大値を求めよ。
制約
解法
各プレイヤーには、その人が好きなカードだけを 枚以下配ると考えてしまって良いです。その操作によって配られなかったカードを適当に配分することで、幸福度を変えずに「各プレイヤーちょうど
枚」にできるからです。
同じ数字が好きな人ごとに分けて考えましょう。そうすると各数字について、「プレイヤー 人に、その人達が好きなカードを合計
枚以下配るときの最大幸福度はいくつになるか?」という問題を解けば良いです。これを各数字について別々に計算するのではなく、取り得る
の組み合わせ全てについて最大幸福度を前計算してしまうという方針を取ります。
各値の取り得る範囲を制約から確認しておくと、 は人数なので
、
はカードの枚数なので
です。この全ての
の組み合わせについて最大幸福度を求めるために、以下のDPを組みます。
プレイヤー
人に合計
枚以下のカードを配る時の最大幸福度
枚「以下」とするためには、余らせる分を最初に消化するつもりで初期条件を
とします。(実際には
についても
人「以下」と見なせるので、全ての
を
で初期化しても良いです)
そして からの遷移は、次のプレイヤーに配るカードの枚数を
として、
を加算して
に遷移すれば良いです。ここでの
は
の範囲を動きます。
つまりDPの計算量は となり、少し厳しいですが間に合います。
これで全ての数字についての最大幸福度が で得られるようになったので、それらを全て合計すれば答えになります。