【每日一题】931 . 最小下降路径总和

【每日一题】931 . 最小下降路径总和

931 . 最小下降路径总和

题目描述

给你一个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:

在这里插入图片描述

输入: matrix = [[-19,57],[-40,-5]]
输出: -59
解释:如图所示,为和最小的下降路径

提示:

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

解题思路

思路:动态规划。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿着对角线向左或者向右的第一个元素),即表明当前行元素可以由上一行左上角、正上方、右上角元素推导出来。该题麻烦在边界条件的处理,此处可以在方阵周围加一圈,并且由于是每行选择元素,故在1~n行的左右两列需要设置为INT_MAX使其不可选。

int minFallingPathSum(vector<vector<int>>& matrix) 
{
   int n=matrix.size();
   //dp[i][j]表示第i行选择第j列累积的下降路径最小和
   vector<vector<int>> dp(n+2,vector<int>(n+2,0));
   //最左边和最右边两列需要赋值为INT_MAX 即不可选择对应行上的这些元素 特殊处理
   for(int k=1;k<=n;k++)
   {
     dp[k][0]=INT_MAX;
     dp[k][n+1]=INT_MAX;
   }
   int res=INT_MAX;
   for(int i=1;i<=n;i++)
   {
    for(int j=1;j<=n;j++)
    {
  dp[i][j]=min({dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1]})+matrix[i-1][j-1];
      if(i==n) //最后一行 收集结果
        res=min(res,dp[i][j]);
    }
   }
   return res;
 }
};

猜你喜欢

转载自blog.csdn.net/qq_43779149/article/details/131696549