Giả sử chúng ta có một ma trận 2D trong đó ma trận [r, c] đại diện cho số đồng xu trong ô đó. Chúng ta có thể bắt đầu từ bất kỳ vị trí nào và muốn thu thập tiền xu bằng cách di chuyển bất kỳ trong bốn hướng (lên, xuống, trái và phải, không phải theo đường chéo). Khi chúng ta di chuyển đến một ô, số xu sẽ được thu thập và giá trị của ô đó trở thành 0. Chúng tôi không thể truy cập vào ô có 0 xu, chúng tôi phải tìm số lượng xu tối đa mà chúng tôi có thể thu thập.
Vì vậy, nếu đầu vào giống như
2 | 4 | 3 |
3 | 6 | 0 |
2 | 0 | 12 |
thì đầu ra sẽ là 18, vì chúng ta có thể đi theo đường dẫn 2 -> 3 -> 6 -> 4 -> 3
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
nếu ma trận trống, thì
-
trả về 0
-
-
n:=số hàng của ma trận, m:=số cột của tấm nền
-
x:=một danh sách như [−1, 1, 0, 0], y:=một danh sách như [0, 0, −1, 1]
-
Định nghĩa một hàm dùng (). Điều này sẽ mất a, b
-
ret:=0
-
đối với k trong phạm vi 0 đến 3, thực hiện
-
(t1, t2):=(x [k] + a, y [k] + b)
-
nếu (t1, t2) là ô hợp lệ thì
-
t:=mat [t1, t2], mat [t1, t2]:=0
-
ret:=tối đa ret và (dùng (t1, t2) + t)
-
mat [t1, t2]:=t
-
-
-
trả lại ret
-
Từ phương thức chính, hãy làm như sau -
-
res:=0
-
đối với tôi trong phạm vi từ 0 đến n - 1, hãy thực hiện
-
đối với j trong phạm vi 0 đến m - 1, thực hiện
-
nếu mat [i, j] khác 0, thì
-
t:=mat [i, j], mat [i, j]:=0
-
res:=tối đa của res và (dùng (i, j) + temp)
-
-
-
-
trả lại res
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
class Solution: def solve(self, mat): if not mat: return 0 n, m = len(mat), len(mat[0]) x, y = [−1, 1, 0, 0], [0, 0, −1, 1] def ok(a, b): return 0 <= a < n and 0 <= b < m and mat[a][b] def util(a, b): ret = 0 for k in range(4): t1, t2 = x[k] + a, y[k] + b if ok(t1, t2): t, mat[t1][t2] = mat[t1][t2], 0 ret = max(ret, util(t1, t2) + t) mat[t1][t2] = t return ret res = 0 for i in range(n): for j in range(m): if mat[i][j]: temp, mat[i][j] = mat[i][j], 0 res = max(res, util(i, j) + temp) return res ob = Solution() matrix = [ [2, 4, 3], [3, 6, 0], [2, 0, 12] ] print(ob.solve(matrix))
Đầu vào
[ [2, 4, 3], [3, 6, 0], [2, 0, 12] ]
Đầu ra
18