0, 1, 2, …, N-1로 표시된 N개의 항목이 있다고 가정합니다. 그런 다음 세트라고 하는 크기 S의 2D 목록이 제공됩니다. 여기에서 가격 세트[i,2]에 대한 i번째 세트를 구매할 수 있으며, 세트[i, 0]에서 세트[i, 1] 사이의 모든 항목을 받습니다. 또한 제거라고 하는 크기 N의 목록이 있습니다. 여기서 가격 제거[i]를 위해 i번째 요소의 인스턴스 1개를 버릴 수 있습니다. 따라서 0에서 N-1까지의 모든 요소 중 하나를 정확하게 구매하기 위한 최소 비용을 찾아야 합니다. 그렇지 않으면 결과는 -1입니다.
따라서 입력이 다음과 같은 경우 세트 =[ [0, 4, 4], [0, 5, 12], [2, 6, 9], [4, 8, 10]]
제거 =[2, 5, 4, 6, 8]이면 출력은 4가 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
N :=제거 크기
-
그래프 :=크기(N + 1) x (N + 1)에 대한 새 행렬
-
세트의 각 s, e, w에 대해 수행
-
그래프[s]에 [e+1, w] 추가
-
-
각 i, 인덱스 i의 r 및 제거의 항목 r에 대해 수행
-
그래프[i + 1]에 [i, r] 추가
-
-
pq :=새 힙
-
dist :=새 지도
-
dist[0] :=0
-
pq가 비어 있지 않은 동안 수행
-
d, e :=힙 pq에서 가장 작은 항목 제거
-
dist[e]
-
다음 반복을 계속하십시오
-
-
e가 N과 같으면
-
리턴 d
-
-
그래프[e]의 각 nei, w에 대해 수행
-
d2 :=d + w
-
d2
-
dist[nei] :=d2
-
pq에 [d2, nei] 추가
-
-
-
-
반환 -1
예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
import heapqfrom collections import defaultdictclass 솔루션:def solve(self, sets, 제거):N =len(removals) graph =[[] for _ in range(N + 1)] for s, e, w in sets:graph[s].append([e + 1, w]) for i, r in enumerate(removals):graph[i + 1].append([i, r]) pq =[[0, 0]] dist =defaultdict(lambda:float("inf")) dist[0] =0 동안 pq:d, e =heapq.heappop(pq) if dist[e] 입력
[[0, 4, 4],[0, 5, 12],[2, 6, 9],[4, 8, 10]], [2, 5, 4, 6, 8]사전> 출력
4