You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

矩阵最长递增路径打印结果异常,寻求技术解决方案

嘿,我帮你捋捋这个问题哈!你这情况太常见了——小矩阵测试刚好蒙对,一换大矩阵就暴露逻辑漏洞了😂

问题核心分析

你遇到的问题本质是:代码只算出了最长路径的长度,却没正确跟踪到这条路径的具体元素走向。在4×4矩阵里,你输出的1 1 2只是某条较短路径的内容,而真正的最长递增路径1→2→3并没有被正确捕捉到。

常见错误原因

  • 只记录路径长度,没保存路径方向:很多人实现最长递增路径时,用dp[i][j]仅存储以(i,j)为起点的最长路径长度,但没记录下一步该往哪个方向走,最后回溯时自然会选错路径。
  • 路径起点选择错误:你可能随便选了一个看起来像起点的元素开始回溯,但这个起点并不是最长路径的真正起点(比如4×4矩阵里,最长路径的起点应该是能走到2再走到3的那个1,而不是你当前选的1)。
  • 递增判断的细节漏洞:虽然3×3矩阵没暴露,但要确认代码里有没有误把相等元素当成递增(比如你的矩阵里很多2,要是判断条件写成>=就会出错)。

修复思路与代码示例

1. 给DP数组加路径方向记录

把单纯存长度的dp数组,扩展成同时保存下一步坐标的结构(比如用两个二维数组next_x[i][j]next_y[i][j])。这样找到最长路径起点后,就能顺着方向一步步打印元素。

核心逻辑示例:

// 假设n是行数,m是列数,matrix是原矩阵
vector<vector<int>> dp(n, vector<int>(m, 0));
vector<vector<int>> next_x(n, vector<int>(m, -1));
vector<vector<int>> next_y(n, vector<int>(m, -1));

// 先通过DFS计算最长路径长度和下一步方向
int dfs(int x, int y) {
    if (dp[x][y] != 0) return dp[x][y];
    int max_len = 1;
    // 四个方向:上下左右
    int dirs[4][2] = {{-1,0}, {1,0}, {0,-1}, {0,1}};
    for (auto& dir : dirs) {
        int nx = x + dir[0];
        int ny = y + dir[1];
        // 只走严格递增的邻居
        if (nx >=0 && nx < n && ny >=0 && ny < m && matrix[nx][ny] > matrix[x][y]) {
            int len = 1 + dfs(nx, ny);
            if (len > max_len) {
                max_len = len;
                // 更新当前位置的下一步坐标
                next_x[x][y] = nx;
                next_y[x][y] = ny;
            }
        }
    }
    dp[x][y] = max_len;
    return max_len;
}

// 遍历整个矩阵,找到最长路径的起点
int max_len = 0;
int start_x = 0, start_y = 0;
for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
        dfs(i, j); // 先计算所有位置的dp值
        if (dp[i][j] > max_len) {
            max_len = dp[i][j];
            start_x = i;
            start_y = j;
        }
    }
}

// 顺着方向打印路径
int x = start_x, y = start_y;
while (true) {
    cout << matrix[x][y] << " ";
    int nx = next_x[x][y];
    int ny = next_y[x][y];
    if (nx == -1 && ny == -1) break; // 没有下一步,结束
    x = nx;
    y = ny;
}

2. 关键注意点

  • 必须遍历整个矩阵找起点:不能凭直觉选起点,要找dp值最大的那个位置,它才是最长路径的真正起点。
  • 严格判断递增:一定要用matrix[nx][ny] > matrix[x][y],不能包含等于的情况,否则会出现循环路径。

测试验证

修复后再跑你的4×4矩阵,最长路径会是从左下角的123,或者第二列第三行的123,输出结果就是正确的1 2 3啦。

内容的提问来源于stack exchange,提问作者Snarfy

火山引擎 最新活动