ν‹°μŠ€ν† λ¦¬ λ·°

728x90
λ°˜μ‘ν˜•

문제

 

14889번: μŠ€νƒ€νŠΈμ™€ 링크

예제 2의 κ²½μš°μ— (1, 3, 6), (2, 4, 5)둜 νŒ€μ„ λ‚˜λˆ„λ©΄ 되고, 예제 3의 κ²½μš°μ—λŠ” (1, 2, 4, 5), (3, 6, 7, 8)둜 νŒ€μ„ λ‚˜λˆ„λ©΄ λœλ‹€.

www.acmicpc.net

 

문제 풀이

 μ•žμ„œ ν‘Ό λ¬Έμ œλ“€μ€ (15650 Nκ³Ό M (2), 1759 μ•”ν˜Έ λ§Œλ“€κΈ°) 쑰합을 κ΅¬ν•˜κ±°λ‚˜, 쑰합을 λ§Œμ‘±ν•˜λŠ” 경우λ₯Ό μ°ΎλŠ” λ¬Έμ œμ˜€λ‹€. 이 λ¬Έμ œμ—μ„œλŠ” 쑰합을 순차적으둜 κ΅¬ν•˜κ²Œ 되면 λŒ€μΉ­λ˜λŠ” μ„±μ§ˆμ„ ν™œμš©ν•˜λŠ” λ¬Έμ œμ΄λ‹€. 예λ₯Ό λ“€μ–΄ 예제 μž…λ ₯1을 λ‚˜λˆŒ 수 μžˆλŠ” 쑰합을 순차적으둜 λ‚˜μ—΄ν•˜λ©΄ [0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3]이닀. μ—¬κΈ°μ„œ μ•Œ 수 μžˆλŠ” 것은 [0, 1], [0, 2], [0, 3] [1, 2], [1, 3], [2, 3] 와 같이 (μ‘°ν•©[i], μ‘°ν•© [μ‘°ν•©μ˜ 수 -i - 1])κ°€ ν•˜λ‚˜μ˜ 경우의 수λ₯Ό λ§Œμ‘±ν•œλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.

 

 λ”°λΌμ„œ λ¬Έμ œλŠ” λ‹€μŒκ³Ό 같이 ν•΄κ²°ν•  수 μžˆλ‹€.

  • N에 λ”°λ₯Έ νŒ€μ˜ 쑰합을 DFSλ₯Ό 톡해 κ΅¬ν•œλ‹€.

  • μ•žμ„œ λ§ν•œ 쑰합이 λŒ€μΉ­λ˜λŠ” μ„±μ§ˆμ„ μ΄μš©ν•˜μ—¬, μŠ€νƒ€νŠΈ, 링크 νŒ€μ— λŒ€ν•œ λŠ₯λ ₯치λ₯Ό κ³„μ‚°ν•œλ‹€.

  • μ°¨κ°€ κ°€μž₯ μž‘μ€ 경우λ₯Ό λ°˜ν™˜ν•œλ‹€.

 

μ½”λ“œ

from sys import stdin


def dfs(idx, depth):
    if depth == n // 2:
        case.append([*check])
        return

    for i in range(idx, n):
        if not i in check:
            check[depth] = i
            dfs(i, depth + 1)
            check[depth] = -1


def team_ability(idx):
    sum_ability = 0
    team = case[idx]
    for player in team:
        for other_player in team:
            if other_player == player:
                continue
            sum_ability += ability[player][other_player]
    return sum_ability


if __name__ == '__main__':
    case = []
    answer = 10 ** 7
    n = int(stdin.readline())
    idx = [i for i in range(n)]
    ability = [list(map(int, stdin.readline().split())) for _ in range(n)]
    check = [-1] * (n // 2)
    dfs(0, 0)
    print(case)

    for i in range(len(case) // 2):
        answer = min(answer, abs(team_ability(i) - team_ability(-i-1)))

    print(answer)

νŒ€μ˜ λŠ₯λ ₯치λ₯Ό 계산 ν• λ•Œ, if other_player == playerλŠ” μƒλž΅ν•΄λ„ 상관 μ—†λ‹€. i, jκ°€ 같은 κ²½μš°λŠ” 0이기 λ•Œλ¬Έμ΄λ‹€.

728x90
λ°˜μ‘ν˜•
λŒ“κΈ€
κΈ€ 보관함
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€