【每日一题】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;
}
};