LeetCode-329:矩阵中的最长递增路径(动态规划)

原题

给定一个整数矩阵,找出最长递增路径的长度。

对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。

示例 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]。注意不允许在对角线方向上移动。

思路

我的思路是先将所有元素按照从小到大排序。从矩阵的最小值出发,其最长路径值为1,然后计算第二小的数的最长路径值,以此类推进行计算,规则如下:

  1. 周边的数字如果都大于当前数字,那个当前数字只能走一步,记角标1。

  2. 如果周边的数字存在小于当前数字的,因为是从小到大开始计算的,那个较小的数字之前已经计算过了。因此该方向的步数为1+角标数字。当前数字的最终角标为这四个方向中的最大的。

当然, 其实也可以按照从大到小排序。

思路图

在这里插入图片描述
最后,还要避免空集。

具体实现代码(python)
# -*- coding: utf8 -*-
import re

def longth(matrix):
    a = len(matrix)
    dics = {}
    nums_max = 1
    if a != 0:
        b = len(matrix[0])
        for i in range(a):
            for j in range(b):
                dics[(i,j)] = matrix[i][j]
        dic_key = dics.keys()
        values = [[1 for i in range(b)] for j in range(a)]
        dics = sorted(dics.items(), key = lambda x: x[1])
        for dic in dics:
            i = dic[0][0]
            j = dic[0][1]
            if (i+1,j) in dic_key and matrix[i+1][j]<matrix[i][j] and values[i][j]<values[i+1][j]+1:
                values[i][j] = values[i+1][j] + 1
            if (i,j+1) in dic_key and matrix[i][j+1]<matrix[i][j] and values[i][j]<values[i][j+1]+1:
                values[i][j] = values[i][j+1] +1
            if (i-1,j) in dic_key and matrix[i-1][j]<matrix[i][j] and values[i][j]<values[i-1][j]+1:
                values[i][j] = values[i-1][j] +1
            if (i,j-1) in dic_key and matrix[i][j-1]<matrix[i][j] and values[i][j]<values[i][j-1]+1:
                values[i][j] = values[i][j-1] + 1
            nums_max = max(nums_max,values[i][j])
    else:
        nums_max = 0

    return nums_max


matrix_rows = 0
matrix_cols = 0
matrix_rows = int(input())
matrix_cols = int(input())
matrix = []
for matrix_i in range(matrix_rows):
    matrix_temp = map(int, re.split(r'\s+', input().strip()))
    matrix.append(list(matrix_temp))


#matrix = [[9,9,4],[6,6,8],[2,1,1]]
#print matrix
res = longth(matrix)

print(str(res) + "\n")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章