当前位置:首页 > 力扣 > 力扣931题最小下降路径和解析 动态规划解法 LeetCode解题技巧

力扣931题最小下降路径和解析 动态规划解法 LeetCode解题技巧

10个月前 (06-19)

力扣931题最小下降路径和解析 动态规划解法 LeetCode解题技巧  最小下降路径和 动态规划 自底向上递推 第1张

一、题目解读

力扣931题「Minimum Falling Path Sum」(最小下降路径和)要求在一个n x n的整数矩阵中,计算从顶部到底部的最小路径和。路径只能从每个位置向下或对角线移动(即向下、左下、右下)。题目关键在于如何通过路径选择优化,找到全局最小值。

二、解题思路

采用动态规划(Dynamic Programming)自底向上递推的策略。核心思想是从矩阵倒数第二行开始,逐行计算每个位置的最小下降路径和。通过记录当前位置到末尾的最小路径和,避免重复计算,最终得到全局最优解。

三、解题步骤

1. 边界处理:判断矩阵是否为空,空矩阵直接返回0。

2. 递推计算:

    从倒数第二行(i = n-2)开始逆向遍历至第一行。

    对每行每个位置j,计算下一行相邻位置(j-1、j、j+1)中的最小值min_val。

    将min_val累加至当前位置:matrix[i][j] += min_val,更新当前路径和。

3. 结果获取:遍历第一行,返回其中的最小值。

四、代码与注释

#include <vector>
#include <algorithm>
using namespace std;

class Solution {
public:
    int minFallingPathSum(vector<vector<int>>& matrix) {
        int n = matrix.size();
        if (n == 0) return 0; // 空矩阵处理
        
        // 从倒数第二行开始向上递推
        for (int i = n - 2; i >= 0; --i) {
            for (int j = 0; j < n; ++j) {
                // 找出下一行相邻三个位置的最小值
                int min_val = matrix[i+1][j];
                if (j > 0) min_val = min(min_val, matrix[i+1][j-1]); // 左邻居
                if (j < n-1) min_val = min(min_val, matrix[i+1][j+1]); // 右邻居
                matrix[i][j] += min_val; // 累加至当前路径
            }
        }
        
        // 返回第一行中的最小值
        return *min_element(matrix[0].begin(), matrix[0].end());
    }
};

五、总结

该解法通过动态规划将O(n^3)的暴力枚举优化至O(n^2),空间复杂度仅为O(1)(原地修改矩阵)。关键在于利用“最优子结构”性质,自底向上递推避免了重复计算。对于类似需要路径优化的题目,动态规划是核心解题思路。


参考:C++算法

原创内容 转载请注明出处

分享给朋友:

相关文章

牛客DP41精讲:当背包必须装满时,你的状态转移方程该如何调整?

牛客DP41精讲:当背包必须装满时,你的状态转移方程该如何调整?

题目重解我们面对一个经典背包问题的变体:给定n个物品,每个物品有重量w和价值v,背包容量为V。需要回答两个问题:1) 普通情况下能获得的最大价值;2) 必须恰好装满背包时的最大价值(若无法装满则输出0...

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

题目重解给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们的目标是找到一条路径,使得路径上经过的数字总和最大。这个问题在实际中有许多应用场景,如最优路径规划、...

NOIP 2008火柴棒等式题解(C++代码实现)  动态规划与枚举算法详解

NOIP 2008火柴棒等式题解(C++代码实现) 动态规划与枚举算法详解

一、题目解读火柴棒等式问题(NOIP 2008,洛谷P1149)要求使用给定数量的火柴棒,构造形如 A + B = C 的等式,其中A、B、C均为整数,且火柴棒总数恰好等于输入值。需统计符合条件的等式...

2024蓝桥杯省赛B组“传送阵”题解(C++代码+图论算法优化)

2024蓝桥杯省赛B组“传送阵”题解(C++代码+图论算法优化)

一、题目解读2024年蓝桥杯省B组“传送阵”题目要求处理一个包含n个节点的图,节点间存在单向传输关系。每个节点i可传送至a[i]指定的节点,形成可能存在的环结构。题目需求解从任意节点出发能到达的最长路...

洛谷P4999题解析:动态规划求解数字拆分与求和问题(附代码)

洛谷P4999题解析:动态规划求解数字拆分与求和问题(附代码)

一、题目解读洛谷P4999题要求处理给定区间 [L, R] 内数字的拆分与求和问题。每个数字需拆分为其各位数字之和,并计算区间内所有数字之和的累加结果。题目需考虑大数情况,并采用取模运算(MOD=1e...

牛客网288555题解题指南:动态规划求解小红的暑假(附代码解析)

牛客网288555题解题指南:动态规划求解小红的暑假(附代码解析)

一、题目解读牛客网288555题要求解决一个组合数学问题:有三位朋友,每天需邀请其中一位参加聚会,但不能连续两天邀请同一位朋友。给定天数n,求满足条件的不同邀请方案总数。题目考察动态规划、状态转移及组...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。