Giả sử chúng ta có một ma trận M trong đó M [r] [c] đại diện cho chiều cao của ô đó. Nếu chúng ta hiện đang ở góc trên cùng bên trái và muốn đi đến góc dưới cùng bên phải. Chúng ta có thể di chuyển đến các ô liền kề (lên, xuống, trái, phải) chỉ khi chiều cao của ô liền kề đó nhỏ hơn hoặc bằng chiều cao của ô hiện tại. Chúng ta có thể tăng chiều cao của bất kỳ số lượng ô nào trước khi di chuyển, vì vậy chúng ta phải tìm tổng chiều cao tối thiểu cần tăng để có thể chuyển đến ô dưới cùng bên phải.
Vì vậy, nếu đầu vào giống như
2 | 4 | 5 |
8 | 6 | 1 |
thì đầu ra sẽ là 4, vì chúng ta có thể đi theo đường dẫn sau [2, 4, 5, 1] và thay đổi độ cao thành cấu hình này -
5 | 5 | 5 |
8 | 6 | 1 |
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
INF:=infinity
-
R, C:=số hàng của ma trận, số cột của ma trận
-
pq:=tạo hàng đợi ưu tiên bằng cách sử dụng heap và chèn [0, R-1, C-1, M [-1, -1]] vào đó
-
dist:=một bản đồ
-
dist [R-1, C-1, A [-1, -1]]:=0
-
trong khi pq không trống, thực hiện
-
xóa một phần tử khỏi pq và lưu trữ chúng thành d, r, c, h
-
nếu dist [r, c, h]
-
chuyển sang lần lặp tiếp theo
-
-
nếu r và c đều là 0 thì
-
trở lại d
-
-
cho mỗi cặp (nr, nc) trong [[r + 1, c], [r, c + 1], [r-1, c], [r, c-1]], thực hiện
-
nếu 0 <=nr
-
nếu d2
-
dist [nr, nc, h2]:=d2
-
chèn [d2, nr, nc, h2] vào pq
-
-
-
-
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
import collections import heapq class Solution: def solve(self, A): INF = float('inf') R, C = len(A), len(A[0]) pq = [[0, R-1, C-1, A[-1][-1]]] dist = collections.defaultdict(lambda: INF) dist[R-1, C-1, A[-1][-1]] = 0 while pq: d, r, c, h = heapq.heappop(pq) if dist[r, c, h] < d: continue if r == c == 0: return d for nr, nc in [[r+1, c], [r, c+1], [r-1, c], [r, c-1]]: if 0 <= nr < R and 0 <= nc < C: h2 = max(A[nr][nc], h) d2 = d + max(h2 - A[nr][nc], 0) if d2 < dist[nr, nc, h2]: dist[nr, nc, h2] = d2 heapq.heappush(pq, [d2, nr, nc, h2]) ob = Solution() matrix = [ [2, 4, 5], [8, 6, 1] ] print(ob.solve(matrix))
Đầu vào
[[2, 4, 5],[8, 6, 1]]
Đầu ra
4