問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!
for s = 0 to 2^N - 1:
for t = 0 to 2^N - 1:
if t が s の部分集合なら:
dp[s] = max(dp[s], dp[(s と t の差集合)] + Z[t])
t = s
while t >= 0:
t &= s # s と t の論理積をとる
# 部分集合 t に対する処理
t -= 1
この問題は前回の問題と N の制約のみが異なります。
入力は以下のフォーマットで与えられます。
N
A_1 A_2 ... A_N
・ 1 行目には、学生の数を表す整数 N が与えられます。
・ 2 行目には、数列 A が与えられます。
・ 入力は合計で 2 行からなり、入力値最終行の末尾に改行が 1 つ入ります。
各グループの相性の総和 Σ Z_j の最大値を求めてください。
末尾に改行を入れ、余計な文字、空行を含んではいけません。
すべてのテストケースにおいて、以下の条件をみたします。
・ 1 ≦ N ≦ 15
・ 0 ≦ A_i < 2^50
4
1 2 3 4
24
3
7 4 3
21
15
707653749851665 486655667345044 763127172605705 342043409486452 438238760474754 449584922329928 634943318136335 686770025079584 195674230421279 526867366425406 415660722668925 25291999775630 473566887008639 861671609720570 615523627674408
16824523972853352