728x90
https://www.acmicpc.net/problem/14889
14889번: 스타트와 링크
예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.
www.acmicpc.net
모든 조합으로 팀을 정해주었다!
나는 조합을 만들때 스타트팀만 만들었다!
스타트팀에는 무조건 0번째 선수가 들어가있게 구성했다
이래야지 링크팀에는 무조건 0번쨰 선수가 없기 때문에
모든 조합을 구하는것이 아닌! 딱 모든 조합의 반절만 구할 수 있다!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
import sys
from itertools import combinations
input = sys.stdin.readline
n = int(input())
arr = []
p_list = [0]
min_point = 100000000
visit = [0] * n
def score(start_list):
s_point = 0
l_point = 0
link_list = [i for i in range(n) if i not in start_list]
start_combi = list(combinations(start_list, 2))
link_combi = list(combinations(link_list, 2))
for s, l in zip(start_combi, link_combi):
s_point += arr[s[0]][s[1]]
s_point += arr[s[1]][s[0]]
l_point += arr[l[0]][l[1]]
l_point += arr[l[1]][l[0]]
# print(abs(s_point - l_point))
return abs(s_point - l_point)
def dfs(cnt, x):
global p_list, min_point
if cnt == (n // 2) - 1:
result = score(p_list)
if result < min_point:
min_point = result
return
for i in range(x, n):
if visit[i] == 1:
continue
visit[i] = 1
p_list.append(i)
dfs(cnt + 1, i + 1)
p_list.pop()
visit[i] = 0
for i in range(n):
li = list(map(int, input().split()))
arr.append(li)
dfs(0, 1)
print(min_point)
|
cs |
728x90
'PS > 백준' 카테고리의 다른 글
[백준 20055번] 컨베이어 벨트 위의 로봇(파이썬/python) (0) | 2021.07.01 |
---|---|
[백준 21608번] 상어 초등학교 (파이썬/python) (0) | 2021.07.01 |
[백준 14888번] 연산자 끼워넣기 (파이썬/python) (0) | 2021.07.01 |
[백준 16472번] 고냥이 (파이썬/python) (0) | 2021.07.01 |
[백준 13460번] 구슬 탈출 2 (파이썬/python) (0) | 2021.06.24 |