点击直接跳转到该题目

1️⃣题目描述

给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。

下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置 (row, col) 的下一个元素应当是 (row + 1, col - 1)、(row + 1, col) 或者 (row + 1, col + 1)

示例1:

示例2:

注意:

  • n == matrix.length == matrix[i].length
  • 1 <= n <= 100
  • -100 <= matrix[i][j] <= 100

2️⃣题目解析

初始化:

  • 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;

3️⃣解题代码

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;
    }
};

最后通过啦!!!
【算法|动态规划No.16】leetcode931. 下降路径最小和-LMLPHP

10-09 21:56