题目:931. 下降路径最小和
思路:动态规划dp,时间复杂度0(nm)。
从第二排开始dp。
C++版本:
class Solution {
public:
int minFallingPathSum(vector<vector<int>>& matrix) {
int n=matrix.size();
if(n==1) return matrix[0][0];
int mn=INT_MAX;
for(int i=1;i<n;i++){
for(int j=0;j<n;j++){
int t=matrix[i-1][j];
if(j>0) t=min(t,matrix[i-1][j-1]);
if(j<n-1) t=min(t,matrix[i-1][j+1]);
matrix[i][j]+=t;
if(i==n-1) mn=min(mn,matrix[i][j]);
}
}
return mn;
}
};
JAVA版本:
class Solution {
public int minFallingPathSum(int[][] matrix) {
int n=matrix.length;
if(n==1) return matrix[0][0];
int mn=Integer.MAX_VALUE;
for(int i=1;i<n;i++){
for(int j=0;j<n;j++){
int t=matrix[i-1][j];
if(j>0) t=Math.min(t,matrix[i-1][j-1]);
if(j<n-1) t=Math.min(t,matrix[i-1][j+1]);
matrix[i][j]+=t;
if(i==n-1) mn=Math.min(mn,matrix[i][j]);
}
}
return mn;
}
}
Go版本:
func minFallingPathSum(matrix [][]int) int {
n:=len(matrix)
if n==1 {
return matrix[0][0]
}
mn:=math.MaxInt
for i:=1;i<n;i++{
for j:=0;j<n;j++ {
t:=matrix[i-1][j]
if j>0 {
t=min(t,matrix[i-1][j-1])
}
if j<n-1 {
t=min(t,matrix[i-1][j+1])
}
matrix[i][j]+=t;
if i==n-1 {
mn=min(mn,matrix[i][j]);
}
}
}
return mn
}