LintCode 398 [Longest Increasing Continuous Subsequence 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

解题思路

  • 类似于滑雪问题
  • 记忆化搜索 - 因为对于某一个点,可以从上下左右更新,所以很难写出for循环那种DP
  • 所谓记忆化所有,就是当我想更新matrix[x][y]的时候,我需要知道以matrix[x-1][y], matrix[x][y-1], matrix[x+1][y], matrix[x][y+1]这四个点结尾的最大长度,每次求出以matrix某个点结尾的连续的最大长度之后,都记录下来,下一次先去记忆的matrix中找,没有再算,有的话直接返回值

完整代码

class Solution:
    # @param {int[][]} A an integer matrix
    # @return {int}  an integer
    DIRECTIONS = [(1, 0), (0, 1), (0, -1), (-1, 0)]
    def longestIncreasingContinuousSubsequenceII(self, A):
        # Write your code here
        if len(A) == 0 or len(A[0]) == 0:
            return 0
        self.width = len(A[0])
        self.height = len(A)
        self.matrix = [[0 for i in range(self.width)] for j in range(self.height)]
        for i in range(self.height):
            for j in range(self.width):
                self.search(A, i, j)
        return max(max(row) for row in self.matrix)
    
    def search(self, A, x, y):
        if self.matrix[x][y] != 0:
            return self.matrix[x][y]
        
        longest = 1
        for dx, dy in self.DIRECTIONS:
            if x + dx < 0 or x + dx >= self.height:
                continue
            if y + dy < 0 or y + dy >= self.width:
                continue
            if A[x][y] >= A[x + dx][y + dy]:
                continue
            longest = max(longest, self.search(A, x + dx, y + dy) + 1)
        self.matrix[x][y] = longest
        return self.matrix[x][y]

你可能感兴趣的:(LintCode 398 [Longest Increasing Continuous Subsequence II])