n = int(input()) # 사람과 일의 수 n d = [list(map(int, input().split())) for _ in range(n)] # 각 사람(행)마다의 일(열) dp = [[1e9 for _ in range(1 << n)] for _ in range(20)] def recur(cnt, visit): # if cnt == n: if visit == (1 << n) - 1: # 사람들에게 모든 일 배분 다 했다면 return 0 if dp[cnt][visit] != 1e9: # 메모이제이션 해놓은 값이 있다면 꺼내 쓰기 return dp[cnt][visit] for i in range(n): # 처음 저장하는 경우라면 모든 노드를 순회 bit = 1 << i # i번째 원소 표현 # if visited: if visit & bit: # 이미 일 배정 되어 있다면 skip (방문 했다면 skip 역할) continue # 비용 최솟값으로 갱신 # 현재 비용 + 다음 사람 일 배분 비용(남은 노드 방문) vs 저장된 값 dp[cnt][visit] = min(recur(cnt + 1, visit | bit) + d[cnt][i], dp[cnt][visit]) # tmp = recur(cnt + 1, visit | bit) + d[cnt][i] # 현재 비용 + 다음 사람 일 배분 비용(남은 노드 방문) # if tmp < dp[cnt][visit]: # dp[cnt][visit] = tmp return dp[cnt][visit] # cnt에서 앞으로 다른 노드들(visit)을 방문할 때의 최소비용 반환 print(recur(0, 0))
'Algorithm > Baekjoon' 카테고리의 다른 글
[Python] 9663. N-Queen (0) | 2022.01.14 |
---|---|
[Python] 2098. 외판원 순회 (0) | 2022.01.12 |
[Python] 14719. 빗물 (0) | 2022.01.01 |
[Python] 2346. 풍선 터뜨리기 (0) | 2022.01.01 |
[Python] 9252. LCS2 (0) | 2022.01.01 |