Giả sử chúng ta có một ma trận; chúng ta phải tìm độ dài của con đường tăng dài nhất. Từ mỗi ô, chúng ta có thể di chuyển sang bốn hướng - trái, phải, lên hoặc xuống. Chúng ta không thể di chuyển theo đường chéo hoặc di chuyển ra ngoài ranh giới.
Vì vậy, nếu đầu vào giống như
9 | 9 | 4 |
6 | 6 | 8 |
2 | 1 | 1 |
thì đầu ra sẽ là 4 vì đường tăng dài nhất là [3, 4, 5, 6].
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
Định nghĩa một hàm giải quyết (). Điều này sẽ lấy i, j, ma trận
-
nếu dp [i, j] khác 0 thì
-
trả về dp [i, j]
-
-
dp [i, j]:=1
-
tạm thời:=0
-
đối với r trong phạm vi i-1 đến i + 2, thực hiện
-
đối với c trong phạm vi j-1 đến j + 2, thực hiện
-
nếu r giống với i và c giống với j hoặc (| r-i | giống với 1 và | c-j | giống với 1) thì
-
chuyển sang lần lặp tiếp theo
-
-
nếu c> =0 và r> =0 và r
ma trận [i, j], thì-
temp:=tối đa của tạm thời, giải quyết (r, c, ma trận)
-
-
-
-
dp [i, j]:=dp [i, j] + temp
-
trả về dp [i, j]
-
Từ phương thức chính, hãy làm như sau -
-
nếu không ma trận là khác 0, thì
-
trả về 0
-
-
dp:=một ma trận có kích thước giống như ma trận đã cho và điền bằng 0
-
ans:=0
-
đối với tôi trong phạm vi từ 0 đến kích thước của ma trận, thực hiện
-
đối với j trong phạm vi 0 đến kích thước của ma trận [0], thực hiện
-
nếu dp [i, j] giống 0 thì
-
giải quyết (i, j, ma trận)
-
-
-
-
trả lại ans
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
class Solution(object): def solve(self,i,j,matrix): if self.dp[i][j]: return self.dp[i][j] self.dp[i][j] = 1 temp = 0 for r in range(i-1,i+2): for c in range(j-1,j+2): if r==i and c==j or (abs(r-i)==1 and abs(c-j)==1): continue if c>=0 and r>=0 and r<len(matrix) and c<len(matrix[0]) and matrix[r][c]>matrix[i][j]: temp = max(temp,self.solve(r,c,matrix)) self.dp[i][j]+=temp return self.dp[i][j] def longestIncreasingPath(self, matrix): if not matrix: return 0 self.dp = [ [0 for i in range(len(matrix[0]))] for j in range(len(matrix))] self.ans = 0 for i in range(len(matrix)): for j in range(len(matrix[0])): if self.dp[i][j]==0: self.solve(i,j,matrix) self.ans = max(self.ans,self.dp[i][j]) return self.ans ob = Solution() print(ob.longestIncreasingPath([[9,9,4],[6,6,8],[2,1,1]]))
Đầu vào
[[9,9,4],[6,6,8],[2,1,1]]
Đầu ra
4