조합을 쓰자.
- 후보 candidate를 N명 생성한다.
- 조합을 통해 스타트팀을 구하고 나머지를 링크팀으로 정한다.
- 스타트팀 점수는 더하고 링크팀 점수는 뺀다
- 절대값이 가장 작은 값을 출력한다.
import sys
from itertools import combinations
input = sys.stdin.readline
N = int(input())
arr = []
for _ in range(N):
_input = list(map(int, input().split()))
arr.append(_input)
candidate = [i for i in range(N)]
result = sys.maxsize
for comb in combinations(candidate, N//2):
start = set(comb)
link = set(candidate) - start
start = list(start)
link = list(link)
score = 0
for i in range(1, N//2):
for j in range(i):
score += arr[start[i]][start[j]] + arr[start[j]][start[i]]
score -= arr[link[i]][link[j]] + arr[link[j]][link[i]]
result = min(abs(score), result)
print(result)
'개발 > 알고리즘' 카테고리의 다른 글
[백준 1655] 가운데를 말해요 (python) (0) | 2021.04.27 |
---|---|
[백준 21608] 상어 초등학교 (python) (0) | 2021.04.26 |
[백준 2096] 내려가기 (python) (0) | 2021.04.26 |
[백준 2143] 두 배열의 합 (python) (0) | 2021.04.26 |
[백준 1806] 부분합 (python) (0) | 2021.04.23 |
최근댓글