LintCode-最长上升连续子序列 II

描述

给定一个整数矩阵(其中,有 n 行, m 列),请找出矩阵中的最长上升连续子序列。(最长上升连续子序列可从任意行或任意列开始,向上/下/左/右任意方向移动)。

样例

给定一个矩阵

[
[1 ,2 ,3 ,4 ,5],
[16,17,24,23,6],
[15,18,25,22,7],
[14,19,20,21,8],
[13,12,11,10,9]
]
返回 25

挑战

O(nm) 时间复杂度及存储

代码

class Solution:
    """
    @param matrix: A 2D-array of integers
    @return: an integer
    """

    def longestContinuousIncreasingSubsequence2(self, matrix):
        # write your code here
        if len(matrix) == 0:
            return 0
        self.matrix = matrix
        self.maxIndex_n = len(matrix) - 1
        self.maxIndex_m = len(matrix[0]) - 1
        result = 0
        self.dp = [[0 for j in range(len(matrix[0]))] for i in range(len(matrix))]
        for i in range(len(matrix)):
            for j in range(len(matrix[0])):
                self.dp[i][j] = self.Dfs(i, j)
                result = max(result, self.dp[i][j])
        return result

    def Dfs(self, i, j):
        if self.dp[i][j] != 0:
            return self.dp[i][j]
        result = 0
        if self.matrix[max(i - 1, 0)][j] > self.matrix[i][j]:
            result = max(result, self.Dfs(max(i - 1, 0), j))
        if self.matrix[min(i + 1, self.maxIndex_n)][j] > self.matrix[i][j]:
            result = max(result, self.Dfs(min(i + 1, self.maxIndex_n), j))
        if self.matrix[i][min(j + 1, self.maxIndex_m)] > self.matrix[i][j]:
            result = max(result, self.Dfs(i, min(j + 1, self.maxIndex_m)))
        if self.matrix[i][max(j-1, 0)] > self.matrix[i][j]:
            result = max(result, self.Dfs(i, max(j-1, 0)))
        self.dp[i][j] = result+1
        return result + 1

动态规划加DFS,DFS来搜索某个点(i,j)的局部最长连续子序列,并通过动态规划思想的dp数组记录,这样,例如在搜索1的局部最长连续子序列长度时,一定会经过21,22,23,24等数,那么“顺便就可以将”他们的局部最长连续子序列长度填入dp数组中,在之后遍历或是其他的点搜索到到它们这些点时,就不需要进行更深层次的递归,直接返回这个值即可。
总而言之,还是动态规划的思路,不过对与数据的遍历由单纯的循环拓展为了循环加DFS。

你可能感兴趣的:(LintCode-最长上升连续子序列 II)