力扣labuladong一刷day61天动态规划最优子结构
一、931. 下降路径最小和
题目链接:https://leetcode.cn/problems/minimum-falling-path-sum/description/
如下图所示,求最小下降路径,定义dp[i][j]表示从最上面那行的任意位置抵达到nums[i][j]这个位置的最小路径和。根据题意每个位置只能从它上一行中的正上方的3个位置中得来,递推公式为dp[i][j]=min(dp[i-1][j-1], dp[i-1][j], dp[i-1][j+1])+nums[i][j],因为是下降路径,遍历顺序自然是从上往下,从左往右,没啥限制每个节点都得遍历,时间复杂度为n2。可以不new新的dp数组,直接在nums上做运算,空间复杂度1。
class Solution {
public int minFallingPathSum(int[][] matrix) {
int len = matrix.length, max = Integer.MAX_VALUE;
for (int i = 1; i < matrix.length; i++) {
for (int j = 0; j < matrix.length; j++) {
int left = j-1>=0 ? matrix[i-1][j-1]:max;
int mid = matrix[i-1][j];
int right = j+1<len ? matrix[i-1][j+1]:max;
matrix[i][j] = Math.min(Math.min(left, mid), right) + matrix[i][j];
}
}
int min = Integer.MAX_VALUE;
for (int i = 0; i < len; i++) {
min = Math.min(min, matrix[len-1][i]);
}
return min;
}
}