个人主页:兜里有颗棉花糖
欢迎 点赞 收藏✨ 留言✉ 加关注本文由 兜里有颗棉花糖 原创
收录于专栏【手撕算法系列专栏】【LeetCode】
本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助
希望我们一起努力、成长,共同进步。
点击直接跳转到该题目
给你一个 n x n
的 方形 整数数组 matrix ,请你找出并返回通过 matrix
的下降路径 的 最小和 。
下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置 (row, col)
的下一个元素应当是 (row + 1, col - 1)、(row + 1, col)
或者 (row + 1, col + 1)
。
示例1:
输入:matrix = [[2,1,3],[6,5,4],[7,8,9]]
输出:13
解释:如图所示,为和最小的两条下降路径
示例2:
注意:
n == matrix.length == matrix[i].length
1 <= n <= 100
-100 <= matrix[i][j] <= 100
初始化:
dp表
多开辟了一块空间。这是因为在计算最小下降路径和时,每一行的路径和都依赖于上一行的路径和。为了简化边界条件的处理,我们可以在dp表的第一行和最后一行外分别多开辟一列,将这些额外的空间初始化为INT_MAX。这样,当计算最小路径和时,我们不必特殊处理边界情况,而是统一使用通用的递推公式。(简而言之,多开辟了一行两列的空间
)状态表示:
dp[i][j]
表示到达(i,j)
位置的最小下降路径和状态转移方程:
dp[i][j] = max(max(dp[i-1][j-1],dp[i-1][j]),dp[i-1][j+1]) + matrix[i][j]
返回值:
循环遍历dp表中的所有有效位置
:ret = min(ret,dp[n][i]);
for(int i = 1;i <= n;i++)
{
ret = min(ret,dp[n][i]);
}
return ret;
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 i = 0;i < n + 2;i++) dp[0][i] = 0;
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= n;j++)
{
int x = dp[i - 1][j - 1],y = dp[i - 1][j],z = dp[i - 1][j + 1];
dp[i][j] = matrix[i - 1][j - 1] + min(min(x,y),z);
}
}
int ret = INT_MAX;
for(int i = 1;i <= n;i++)
{
ret = min(ret,dp[n][i]);
}
return ret;
}
};