描述
给定一个 m x n 整数矩阵 matrix ,找出其中最长递增路径的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。
输入
第一行n,m。1<=n,m<=200
接下来是n*m的矩阵
输出
最长递增路径
输入样例 1
3 3 9 9 4 6 6 8 2 1 1
输出样例 1
4
输入样例 2
3 3 3 4 5 3 2 6 2 2 1
输出样例 2
4
来源 LC329
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 210;
int n, m;
int g[N][N];
int res[N][N]; // 存放以 x, y 为起点的最长路径
bool st[N][N];
int dx[4] = { 0, -1, 0, 1 };
int dy[4] = { 1, 0, -1, 0 };
int dfs(int sx, int sy)
{
if (res[sx][sy]) return res[sx][sy];
res[sx][sy] = 1; // 至少长度为 1
for (int i = 0; i < 4; i++)
{
int x = sx + dx[i], y = sy + dy[i];
if (x < 0 || x >= n || y < 0 || y >= m) continue;
if (g[sx][sy] < g[x][y])
res[sx][sy] = max(res[sx][sy], dfs(x, y) + 1);
}
return res[sx][sy];
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
scanf("%d", &g[i][j]);
int ans = 0;
for(int i = 0; i < n; i ++)
for (int j = 0; j < m; j++)
{
ans = max(ans, dfs(i, j));
}
printf("%d\n", ans);
return 0;
}