ツバサの備忘録

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

COLOCON -Colopl programming contest 2018- C - すぬけそだて――ごはん――

問題
提出コード

解法

あらかじめ、ある数xyが同時に存在しうるか、を調べておきます。
使用できる数を、前半の20個と、残りの2つの部分に分け、それぞれに処理をしていきます。
最終的には、前半の状態を1つ決めた時の、後半の場合の数を高速に計算して、前半の状態を全探索します。
後半部分について、前計算で以下のようなDPを行います。
dp[S] = 後半の数から選んだ集合Sの中でのカードの選び方
 iを、Sに含まれる最大の数とします。Pを、S \setminus \{i\}の中で、iと同時に選べる数の集合とします。すると、
dp[S] = dp[S \setminus \{i\}] + dp[P]
というようにして計算を行っていくことができます。
あとは、前半部分の集合を1つ決めたときに、その集合に対して使用できる後半部分の集合を計算し、その集合に対応するDPの配列を参照して足していくことで、答えを求めることができます。
最初に計算した同時に存在しうるかどうか、の情報をlong long型の変数で持っておくと、その後の計算が楽かつ高速に行えるので、この問題に答えることができます。

感想

模擬国内Eの復習をサボっていたら同じような問題にあたってしまいました…
と思っていたのですが、bitDPなり全探索なりでもいけるみたいですね!