动态规划-931.下降路径最小和-力扣(LeetCode)

一、题目解析

从最顶上出发,有三个位置选择,左中下(边界除外),使其走到最下面时下降路径最小。

二、算法原理

1、状态表示

我们需要的是到达[i,j]的最小路径和,所以此时dp[i][j]表示:到达[i,j]位置时,最小的下降路径

2、状态转移方程

对于某个位置有三种下降方式,自然也就有三种到达该位置的方式

dp[i][j] 从[i-1,j-1]->[i,j]->dp[i-1][i-1]+matrix[i][j]

从[i-1,j]->[i,j]->dp[i-1][j]+matrix[i][j]

从[i-1][j+1]->[i,j]->dp[i-1][j+1]+matrix[i][j]

dp[i][j]=min(dp[i-1][j-1]+matrix[i][j],min(dp[i-1][j]+matrix[i][j],dp[i-1][j+1]+matrix[i][j]))

3、初始化

除了最上面一排初始化为0,其余位置要初始化为最大值,由于min的原因,如果都初始化为0,则会计算出错

4、填表顺序

从上往下,从左往右

5、返回值

由于到达最下面就停止了,所以取最后一排的最小值

自己动手实现一下吧,链接:931. 下降路径最小和 - 力扣(LeetCode)

三、代码示例

cpp 复制代码
class Solution {
public:
    int minFallingPathSum(vector<vector<int>>& matrix) {
        int n = matrix.size();
        vector<vector<int>> dp(n+1,vector<int>(n+2,INT_MAX));
        for(int j = 0;j<n+2;j++) dp[0][j] = 0;
        for(int i = 1;i<=n;i++)
        {
            for(int j = 1;j<=n;j++)
            {
                dp[i][j] = min(dp[i-1][j-1],min(dp[i-1][j],dp[i-1][j+1])) + matrix[i-1][j-1];
            }
        }
        int ret = INT_MAX;
        for(int j = 1;j<=n;j++) ret = min(ret,dp[n][j]);
        return ret;
    }
};

看到最后,如果对您有所帮助,还请点赞、收藏和关注,点点关注不迷路,我们下期再见!

相关推荐
hqxstudying3 分钟前
深入解析 Java List 实现类的底层原理
java·数据结构·算法·链表
A.A呐11 分钟前
【Linux第四章】gcc、makefile、git、GDB
linux·c语言·开发语言·c++·git
struggle20251 小时前
torchmd-net开源程序是训练神经网络潜力
c++·人工智能·python·深度学习·神经网络
xuanzdhc1 小时前
C++重点知识详解(命名空间,缺省参数,函数重载)
开发语言·c++
C羊驼1 小时前
C语言:排序算法
c语言·算法·排序算法
float_com1 小时前
【单调栈】-----【Largest Rectangle in a Histogram】
算法··单调栈
↣life♚2 小时前
SAM2论文解读-既实现了视频的分割一切,又比图像的分割一切SAM更快更好
人工智能·深度学习·算法·计算机视觉·视频分割·通用分割
虾球xz2 小时前
CppCon 2017 学习:Howling at the Moon: Lua for C++ Programmers
开发语言·c++·学习·lua
鼓掌MVP2 小时前
“荔枝使”的难题怎么破:A*运输路径算法编程实践
算法
GIS小天2 小时前
AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月21日第115弹
人工智能·算法·机器学习·彩票