LeetCode 329. 행렬 의 최 장 증가 경로 (역 추적 또는 토폴로지 정렬 + 동적 계획)

Description
정수 행렬 을 지정 하여 최 장 증가 경로 의 길 이 를 찾 습 니 다.
각 칸 에 대해 서 는 위, 아래, 왼쪽, 오른쪽 네 방향 으로 이동 할 수 있 습 니 다.대각선 방향 으로 이동 하거나 경계 밖으로 이동 할 수 없습니다.
   1:

  : nums = 
[
  [9,9,4],
  [6,6,8],
  [2,1,1]
] 
  : 4 
  :         [1, 2, 6, 9]。
   2:

  : nums = 
[
  [3,4,5],
  [3,2,6],
  [2,2,1]
] 
  : 4 
  :         [3, 4, 5, 6]。              。

  :  (LeetCode)
  :https://leetcode-cn.com/problems/longest-increasing-path-in-a-matrix
          。           ,          。

솔 루 션 1 역 추적
비망록 을 챙 겨 야 합 니 다.해제
class Solution:
    def longestIncreasingPath(self, matrix: List[List[int]]) -> int:
        if not matrix or not matrix[0]: return 0

        row = len(matrix)
        col = len(matrix[0])
        lookup = [[0] * col for _ in range(row)]

        def dfs(i, j):
            if lookup[i][j] != 0:
                return lookup[i][j]
            #    
            res = 1
            for x, y in [[-1, 0], [1, 0], [0, 1], [0, -1]]:
                tmp_i = x + i
                tmp_j = y + j
                if 0 <= tmp_i < row and 0 <= tmp_j < col and \
                        matrix[tmp_i][tmp_j] > matrix[i][j]:
                    res = max(res, 1 + dfs(tmp_i, tmp_j))
            lookup[i][j] = max(res, lookup[i][j])
            #    
            # val = matrix[i][j]
            # lookup[i][j] = 1 + max(
            #     dfs(i + 1, j) if 0 <= i + 1 < row and 0 <= j < col and matrix[i + 1][j] > val else 0,
            #     dfs(i - 1, j) if 0 <= i - 1 < row and 0 <= j < col and matrix[i - 1][j] > val else 0,
            #     dfs(i, j + 1) if 0 <= i < row and 0 <= j + 1 < col and matrix[i][j + 1] > val else 0,
            #     dfs(i, j - 1) if 0 <= i < row and 0 <= j - 1 < col and matrix[i][j - 1] > val else 0,
            # )
            #    
            # lookup[i][j] = 1 + max(
            #     [dfs(i + x, y + j) for x, y in [[-1, 0], [1, 0], [0, 1], [0, -1]] \
            #      if 0 <= (i + x) < row and 0 <= (j + y) < col and matrix[i + x][j + y] > matrix[i][j]] or [0]
            # )
            
            return lookup[i][j]

        return max(dfs(i, j) for i in range(row) for j in range(col))

  :powcai
  :https://leetcode-cn.com/problems/longest-increasing-path-in-a-matrix/solution/dfsji-chong-xie-fa-by-powcai/
  :  (LeetCode)
        。             ,          。

Solution 2 토폴로지 정렬 + 동적 계획
문 제 는 토폴로지 정렬 로 동적 계획 의 시작 점 을 찾 아 낮은 점 에서 상태 이전 을 한다.

좋은 웹페이지 즐겨찾기