求矩阵中最长的递增路径
Finding longest increasing path in a matrix
本文关键字:路径 更新时间:2023-10-16
这是在线评委,https://leetcode.com/problems/longest-increasing-path-in-a-matrix/
为什么我无法使用DFS获得结果?
当你从每个单元格开始时,可以移动到四个方向:左、右、上或下。
存储最长递增路径的长度。
/*
for each elem, neighbours dfs
*/
class Solution {
public:
int longestIncreasingPath(vector<vector<int>>& matrix) {
int row = matrix.size();
int col = matrix[0].size();
int x[] = {0,1,0,-1};// l-r -1,1
int y[] = {1,0,-1,0};// up-down +1,-1
int maxlen = 0;
for(int i = 0; i < row; i++){
for(int j = 0; j< col; j++){
// each node in the matrix[i][j], neighbours
int len = 0;
dfs(maxlen, len, i, j, x, y, matrix);
}
}
return maxlen;
}
private:
bool isIn(int x, int y, int row, int col){
if(x>=0&&x<=col && y>=0&&y<=row) return true;
else return false;
}
void dfs(int& maxlen, int len, int i, int j,int* x, int* y, vector<vector<int>> matrix){
int row = matrix.size();
int col = matrix[0].size();
for(int k = 0; k < 4; k++){
int i_t = i+x[k];//the current position
int j_t = j+y[k];
if(isIn(i_t,j_t,row,col)&& (matrix[i_t][j_t]>matrix[i][j]) ){ // if inside the matrix, within the boundary&& the value of (i_t,j_t)>
len+=1;
maxlen = max(len,maxlen);
dfs(maxlen, len, i_t, j_t, x, y, matrix);
}
}
}
};
此代码存在多个问题。
if(x>=0&&x<=col && y>=0&&y<=row)
应更改为if(x>=0&&x<col && y>=0&&y<row)
-
您将源自一个元素的所有路径添加在一起,这将导致错误的答案。这部分代码
len+=1; maxlen = max(len,maxlen); dfs(maxlen, len, i_t, j_t, x, y, matrix);
应更改为:
//len+=1; maxlen = max(len+1,maxlen); dfs(maxlen, len+1, i_t, j_t, x, y, matrix);
这样你就不会把不同方向的所有路径加在一起。
- 你正在解决许多重叠的问题。一旦调用
dfs(r,c)
,就可以保存其结果,并将该值用于将来的引用(动态编程)
- 你正在解决许多重叠的问题。一旦调用
这就是我实现它的方式:
#include <vector>
#include <iostream>
#include <map>
using namespace std;
map< pair<int,int>, int > dp;
pair<int,int> moves[] = {{0,1},{0,-1},{1,0},{-1,0}};
vector<vector<int> > matrix = { {3,4,5},
{3,2,6},
{2,2,1}};
int dfs(int r, int c, int n_rows, int n_cols){
pair<int,int> p = make_pair(r,c);
if ( dp.count(p) ){
return dp[p];
}
int mx = 0;
for ( int i=0; i<4; ++i ){
int next_r = r+moves[i].first;
int next_c = c+moves[i].second;
if ( 0<=next_r && next_r < n_rows && 0<=next_c && next_c < n_cols ){
if ( matrix[next_r][next_c] > matrix[r][c] )
mx = max(mx, dfs(next_r, next_c, n_rows, n_cols));
}
}
mx++;
dp[p] = mx;
return mx;
}
int main(){
int rows = matrix.size();
int cols = matrix[0].size();
int result = 0;
for ( int i=0; i<rows; ++i ){
for ( int j=0; j<cols; ++j ){
result = max(result, dfs(i,j,rows,cols));
}
}
cout << result << endl;
}
这是我使用DFS+记忆化的解决方案
class Solution {
int r;
int c;
public:
int longestIncreasingPath(vector<vector<int>>& matrix) {
r = matrix.size();
if(r == 0) return 0;
c= matrix[0].size();
int maxlength = 0;
vector<vector<int>> dfs(r, vector<int>(c, 0));
for(int i = 0; i < r; ++i) {
for(int j = 0 ; j < c; ++j) {
int curr = recursive(i,j, dfs, matrix);
maxlength = max(maxlength, curr);
}
}
return maxlength;
}
int recursive(int i, int j, vector<vector<int>>& dfs, vector<vector<int>>& matrix) {
if(dfs[i][j] != 0) return dfs[i][j];
else {
int maxi = 1;
// b.c 1
if (i-1 >= 0 && (matrix[i-1][j]>matrix[i][j])) {
maxi = max(maxi,1+ recursive(i-1, j, dfs, matrix));
}
// b.c 2
if (j -1 >=0 && (matrix[i][j-1]>matrix[i][j])) {
maxi = max(maxi,1+ recursive(i, j-1, dfs, matrix));
}
// b.c 3
if (i+1 < r && (matrix[i+1][j]>matrix[i][j])) {
maxi = max(maxi,1+ recursive(i+1, j, dfs, matrix));
}
// b.c. 4
if(j+1 < c && (matrix[i][j+1]>matrix[i][j])) {
maxi = max(maxi,1+ recursive(i, j+1, dfs, matrix));
}
dfs[i][j] = maxi;
return maxi;
}
}
};
相关文章:
- 如何将更多文件夹添加到c++include路径
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- C++A*算法并不总是在路径中具有目标节点
- 从函数角度看ID到文件路径的内部与外部映射
- boost xml parsingl将xml的路径作为变量发送
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- 如何使用cppcheck处理半相对包含路径
- 在C++中设置基于操作系统的文件路径
- 基于编译器选项的编译二进制路径
- 按边长度递归搜索图中所有可行路径
- 使用变量值作为 PlaySound 中的路径
- 如何转换真实路径 CString c++
- 从 GUID 获取 USB 卷路径
- 查找 GCD:并非所有控制路径都返回值
- C++17 文件系统::remove_all 带有通配符路径
- 在带有尾部斜杠的路径上返回 std::filesystem::create_directories() 的值
- 获取当前正在运行的 exe 名称(不是路径)
- 如何从 Skia 路径几何体中获取网格?
- CMake 错误"源似乎不包含 CMakeLists.txt",路径/库连接问题
- VS Code C++:不准确的系统包括路径错误(wchar.h,boost/lambda/lambda.hpp)