LeedCode_矩阵中的最长递增路径
题目说明
给定一个整数矩阵,找出最长递增路径的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。
输入: nums =
[
[9,9,4],
[6,6,8],
[2,1,1]
]
输出: 4
解释: 最长递增路径为 [1, 2, 6, 9]。
链接:https://leetcode-cn.com/problems/longest-increasing-path-in-a-matrix
分析:采用动态规划和DFS的方法
class longest {
public :
int rows, cols;
int longestIncreasingPath(vector<vector<int>>& matrix)
{
rows = matrix.size();
if (!rows)
return 0;
cols = matrix[0].size();
vector<vector<int>> visited(rows, vector<int>(cols, 0));
int ret = 0;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
ret = max(ret, DFS(matrix, visited, i, j, INT_MIN));
}
}
}
int DFS(vector<vector<int>>& matrix, vector<vector<int>>& visited, int i, int j, int lastvalue)
{
if (i < 0 || i >= rows || j < 0 || j >= cols)
return 0;
int curvalue = matrix[i][j];
if (curvalue <= lastvalue)
{
return 0;
}
int u, r, l, d;
if (!visited[i][j])
{
u = DFS(matrix, visited, i + 1, j, curvalue);
r = DFS(matrix, visited, i, j + 1, curvalue);
l = DFS(matrix, visited, i, j - 1, curvalue);
d = DFS(matrix, visited, i - 1, j, curvalue);
visited[i][j] = 1 + max(max(u, r), max(l, d));
}
return visited[i][j];
}
};