矩阵中的最长递增路径-记忆化搜索

矩阵中的最长递增路径


Solution

一个简单的dfs搜索问题,只需要改成一个带返回值的搜索即可,再加上一个缓存表优化即可通过。

cpp 复制代码
#include<iostream>
#include<vector>
using namespace std;

//递归做法
//f(x,y)表示从(x,y)出发的最长递增路径长度
//由于这题的路径自带单调性,所以不需要设置标记数组
int f1(vector<vector<int>>& matrix, int x, int y) {
	int m = matrix.size();
	int n = matrix[0].size();
	if (x < 0 || x >= m || y < 0 || y >= n) return 0;
	int ans1 = 0, ans2 = 0, ans3 = 0, ans4 = 0;
	if (x + 1 < m && matrix[x + 1][y] > matrix[x][y]) ans1 = f1(matrix, x + 1, y);
	if (x - 1 >= 0 && matrix[x - 1][y] > matrix[x][y])ans2 = f1(matrix, x - 1, y);
	if (y + 1 < n && matrix[x][y + 1] > matrix[x][y]) ans3 = f1(matrix, x, y + 1);
	if (y - 1 >= 0 && matrix[x][y - 1] > matrix[x][y]) ans4 = f1(matrix, x, y - 1);
	return 1 + max(ans1, max(ans2, max(ans3, ans4)));
}

//带缓存表的递归
int f2(vector<vector<int>>& matrix, int x, int y, vector<vector<int>>& dp) {
	int m = matrix.size();
	int n = matrix[0].size();
	if (x < 0 || x >= m || y < 0 || y >= n) return 0;
	int ans1 = 0, ans2 = 0, ans3 = 0, ans4 = 0;
	if (dp[x][y] != -1) return dp[x][y];
	if (x + 1 < m && matrix[x + 1][y] > matrix[x][y]) ans1 = f2(matrix, x + 1, y, dp);
	if (x - 1 >= 0 && matrix[x - 1][y] > matrix[x][y])ans2 = f2(matrix, x - 1, y, dp);
	if (y + 1 < n && matrix[x][y + 1] > matrix[x][y]) ans3 = f2(matrix, x, y + 1, dp);
	if (y - 1 >= 0 && matrix[x][y - 1] > matrix[x][y]) ans4 = f2(matrix, x, y - 1, dp);
	int ans = 1 + max(ans1, max(ans2, max(ans3, ans4)));
	dp[x][y] = ans;
	return ans;
}
int longestIncreasingPath1(vector<vector<int>>& matrix) {
	int m = matrix.size();
	int n = matrix[0].size();
	int ans = 0;
	for (int i = 0; i < m; ++i) {
		for (int j = 0; j < n; ++j) {
			ans = max(ans, f1(matrix, i, j));
		}
	}
	return ans;
}
int longestIncreasingPath(vector<vector<int>>& matrix) {
	int m = matrix.size();
	int n = matrix[0].size();
	vector<vector<int>>dp(m + 1, vector<int>(n + 1, -1));
	int ans = 0;
	for (int i = 0; i < m; ++i) {
		for (int j = 0; j < n; ++j) {
			ans = max(ans, f2(matrix, i, j, dp));
		}
	}
	return ans;
}

int main() {

	return 0;
}
相关推荐
明月_清风1 分钟前
从二叉树到 B+ 树:一文搞懂工程中「树」的演化之道
数据结构·算法·go
渡我白衣5 分钟前
并查集:基础认识与模拟实现
android·java·javascript·数据结构·c++·算法·并查集
如意猴12 分钟前
【C++】001--C++入门(1)
开发语言·c++
hetao173383722 分钟前
2026-09-01~09-04 hetao1733837 的刷题记录
c++·算法
Evand J40 分钟前
【MATLAB例程,图像滤波5】 反谐波均值滑动窗口滤波(CHMF)图像降噪与质量评价,附代码下载链接
图像处理·算法·计算机视觉·matlab·均值算法·滑动窗口滤波·均值滑动
血小板要健康1 小时前
链表 阶段算法总结
java·数据结构·笔记·算法·leetcode·链表
a187927218311 小时前
【算法】回溯算法(三):三记重锤与 N 皇后——记忆化、状态设计与三层漏斗
算法·leetcode·go·剪枝·回溯·n皇后·算法讲解
HugoStudio_SWAN3 小时前
洛谷 P1420 / P1179 / B4262 最长连号、数字统计与词频统计——统计的三种面孔
c++·学习·程序人生·算法
青 春 记 忆4 小时前
LeetCode 350. 两个数组的交集 II|Python 解法详解
python·算法·leetcode
raindayinrain4 小时前
c++并发
c++