zoukankan      html  css  js  c++  java
  • 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]。注意不允许在对角线方向上移动。
    class Solution {
    public:
        int dfs(vector<vector<int>> &matrix, vector<vector<int>> &memo, int x, int y){
            
            if(memo[x][y]!=-1) return memo[x][y];
            
            int dx[] = {1, -1, 0, 0};
            int dy[] = {0, 0, 1, -1};
            int ans = 1;
            for(int i=0; i<4; i++){
                for(int j=0; j<4; j++){
                    int tx = x+dx[i], ty = y+dy[i];
                    if(tx<memo.size() && tx>=0 && ty>=0 && ty<memo[0].size() && matrix[x][y]>matrix[tx][ty]){
                        ans = max(ans, 1+dfs(matrix, memo, tx, ty));
                    }
                }
            }
            return memo[x][y]=ans;
        }
        int longestIncreasingPath(vector<vector<int>>& matrix) {
            
            int m = matrix.size(); if(m==0) return 0;
            int n = matrix[0].size(); if(n==0) return 0;
            vector<vector<int>> memo(m, vector<int>(n, -1));
            int ans = 1;
            for(int i=0; i<m; i++){
                for(int j=0; j<n; j++){
                    ans = max(ans, dfs(matrix, memo, i, j));
                }
            }
            return ans;
        }
        
    };
  • 相关阅读:
    windows中dos命令指南
    HDU 2084 数塔 (dp)
    HDU 1176 免费馅饼 (dp)
    HDU 1004 Let the Balloon Rise (map)
    变态杀人狂 (数学)
    HDU 2717 Catch That Cow (深搜)
    HDU 1234 开门人和关门人 (模拟)
    HDU 1070 Milk (模拟)
    HDU 1175 连连看 (深搜+剪枝)
    HDU 1159 Common Subsequence (dp)
  • 原文地址:https://www.cnblogs.com/Jawen/p/10939366.html
Copyright © 2011-2022 走看看