Skip to content

Instantly share code, notes, and snippets.

@maehrm
Created March 24, 2024 06:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save maehrm/0c22d27f41513399b8315d2cb6945194 to your computer and use it in GitHub Desktop.
Save maehrm/0c22d27f41513399b8315d2cb6945194 to your computer and use it in GitHub Desktop.
N = int(input())
a = [list(map(int, input().split())) for _ in range(N)]
dp = [0] * (1 << N)
cst = [0] * (1 << N)
for msk in range(1 << N): # あらかじめmskグループのときの点数をcstに求めておく
for i in range(N):
for j in range(i + 1, N):
if (msk & (1 << i)) and (msk & (1 << j)):
cst[msk] += a[i][j]
for msk in range(1 << N):
msk2 = msk # msk2は、mskの部分集合を表す
while msk2 > 0:
nxt = dp[msk - msk2] + cst[msk2]
dp[msk] = max(dp[msk], nxt)
msk2 = (msk2 - 1) & msk # この式でmskの部分集合を作っていく
print(dp[(1 << N) - 1])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment