/*
描述
给定一个 n 行 m 列矩阵 matrix ,矩阵内所有数均为非负整数。 你需要在矩阵中找到一条最长路径,使这条路径上的元素是递增的。并输出这条最长路径的长度。
这个路径必须满足以下条件:
1. 对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外。
2. 你不能走重复的单元格。即每个格子最多只能走一次。
带备忘录的递归,
*/
int dfs(vector<vector<int> > &matrix,int x,int y,int last_num,vector<vector<int> > &dp)
{
if(last_num >= matrix[x][y])
return 0;
if(dp[x][y] != -1)
return dp[x][y];
int num = 0;
if(x + 1 < matrix.size())
num = max(num,dfs(matrix,x + 1,y,matrix[x][y],dp));
if(x - 1 >= 0)
num = max(num,dfs(matrix,x - 1,y,matrix[x][y],dp));
if(y - 1 >= 0)
num = max(num,dfs(matrix,x,y - 1,matrix[x][y],dp));
if(y + 1 < matrix[0].size())
num = max(num,dfs(matrix,x,y + 1,matrix[x][y],dp));
dp[x][y] = num + 1;
return num + 1;
}
int solve(vector<vector<int> >& matrix) {
// write code here
int n=matrix.size();
int m=matrix[0].size();
// 特判矩阵为空的情况
if(n==0){
return 0;
}
vector<vector<int> > dp(n,vector<int>(m,-1));
int ans=0;
// int m=matrix[0].size();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
// 枚举每个起点的位置
ans=max(ans,dfs(matrix,i,j,-1,dp));
}
}
return ans;
}
BM61 矩阵最长递增路径(描述给定一个 n 行 m 列矩阵 matrix ,矩阵内所有数均为非负整数。 你需要在矩阵中找到一条最长路径,使这条路径上的元素是递增的。并输出这条最长路径的长度。
最新推荐文章于 2024-05-23 21:19:08 发布