Algorithm/Baekjoon

[Python] 2098. 외판원 순회

느낌표 공장장 2022. 1. 12. 02:34
n = int(input())    # 도시의 수 n
cost = [list(map(int, input().split())) for _ in range(n)]  # 비용 행렬
dp = [[1e9 for _ in range(1 << n)] for _ in range(n)]

def recur(city, visit):
    if visit == (1 << n) - 1:   # 모든 도시 방문했다면
        if cost[city][0]:       # 출발점으로 가는 경로가 있다면 (출발하는 도시 0으로 정했으므로)
            return cost[city][0]    # 비용 리턴
        return 1e9  # 출발점으로 가는 경로 없는 경우

    if dp[city][visit] != 1e9:  # 최소비용 메모이제이션 해놓았다면 꺼내쓰기
        return dp[city][visit]

    for i in range(1, n):   # 모든 도시 탐방 (출발 도시 제외)
        if not cost[city][i]:   # 가는 경로가 없다면 skip
            continue

        if visit & (1 << i):    # 이미 방문한 도시라면 skip
            continue

        # 점화식
        # 현재 비용 + 방문안한 도시 다 탐방한 비용 vs 저장되어 있는 비용
        dp[city][visit] = min(recur(i, visit | (1 << i)) + cost[city][i], dp[city][visit])

    return dp[city][visit]

print(recur(0, 1))  # 순서 상관 x 사이클의 최소비용을 구하면 되니까 임의의 도시 0에서 시작 (0번째 도시, 방문했다 1)
for i in range(n):
    print(dp[i])

'Algorithm > Baekjoon' 카테고리의 다른 글

[Python] 4485. 녹색 옷 입은 애가 젤다지 ?  (0) 2022.01.14
[Python] 9663. N-Queen  (0) 2022.01.14
[Python] 1311. 할 일 정하기 1  (0) 2022.01.12
[Python] 14719. 빗물  (0) 2022.01.01
[Python] 2346. 풍선 터뜨리기  (0) 2022.01.01