华为题:矩阵中的最长递增路径

对于每个单元格,你可以往上、下、左、右四个方向移动。不能沿对角线移动,也不能移动到矩阵边界外。

输入描述

第一行输入两个整数 m 和 n,表示矩阵的行数和列数。

接下来输入 m 行,每行 n 个整数。

输出描述

输出最长递增路径的长度。

示例 1

输入

text

复制代码
3 3
9 9 4
6 6 8
2 1 1

输出

text

复制代码
4

说明

最长递增路径为 1 -> 2 -> 6 -> 9。

C++ 解法

cpp

复制代码
#include <bits/stdc++.h>
using namespace std;

int m, n;
vector<vector<int>> matrix, memo;
int dirs[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};

int dfs(int x, int y) {
    if (memo[x][y] != -1) return memo[x][y];

    int best = 1;

    for (auto& d : dirs) {
        int nx = x + d[0];
        int ny = y + d[1];

        if (nx >= 0 && nx < m && ny >= 0 && ny < n && matrix[nx][ny] > matrix[x][y]) {
            best = max(best, 1 + dfs(nx, ny));
        }
    }

    return memo[x][y] = best;
}

int main() {
    cin >> m >> n;

    matrix.assign(m, vector<int>(n));
    memo.assign(m, vector<int>(n, -1));

    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            cin >> matrix[i][j];
        }
    }

    int ans = 0;

    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            ans = max(ans, dfs(i, j));
        }
    }

    cout << ans << endl;
    return 0;
}
相关推荐
小诗懂技术1 小时前
linux驱动中断,相关中断的方式与适用场景
linux·arm开发·驱动开发·算法
不会就选b1 小时前
算法日常・每日刷题--<动态规划>25
算法
Keep_Trying_Go1 小时前
分割算法FastSAM论文详解
深度学习·算法·计算机视觉
星夜离尘561 小时前
MATLAB 5 点滑动平均:filter 与 conv 的输出对齐,以及 2 样本延时的含义
开发语言·算法·matlab·滤波·fir
Dovis(誓平步青云)1 小时前
总用电下降了,为什么家庭能源看板仍然提示异常
java·开发语言·数据库·人工智能·算法·电脑·能源
开开心心就好1 小时前
A3的PDF怎么切成A4?拖一下分割线就行
服务器·开发语言·python·算法·pdf·ocr·tornado
闻缺陷则喜何志丹2 小时前
详细设计说明书的内容要求
算法·测试·存储
和裕2 小时前
定制纸箱刀卡、平卡、隔档分别是什么?结构与适用场景区别全解析
大数据·运维·网络·人工智能·算法
Tisfy2 小时前
LeetCode 3723.数位平方和的最大值:构造
数学·算法·leetcode·字符串·题解