Computer >> Máy Tính >  >> Lập trình >> Python

Đường dẫn tăng dài nhất trong ma trận bằng Python

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