931. 下降路径最小和 leetcode

给定一个方形整数数组 A,我们想要得到通过 A 的下降路径的最小和。

下降路径可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列。

示例:

输入:[[1,2,3],[4,5,6],[7,8,9]]
输出:12
解释:
可能的下降路径有:
[1,4,7], [1,4,8], [1,5,7], [1,5,8], [1,5,9]
[2,4,7], [2,4,8], [2,5,7], [2,5,8], [2,5,9], [2,6,8], [2,6,9]
[3,5,7], [3,5,8], [3,5,9], [3,6,8], [3,6,9]
和最小的下降路径是 [1,4,7],所以答案是 12。

提示:

1 <= A.length == A[0].length <= 100
-100 <= A[i][j] <= 100


问题解读:求到达最后一行时,每一列累计值最小。
动态规划:
-当只有一行,每一列最小值等于它本身:dp[i][j] = num[i][j];
-当有第二行, 列累计最小值等于第一行列最小值中的最小(每次只能跨一行,那最多让上一行的相邻三个列进行比较求出最小值)
dp[1][j] = min(dp[0][j-1],dp[0][j],dp[0][j+1])+num[0][j];
-第i行dp[i][j] = min(dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1])+num[i][j];
-最后一行求出每列累计最小值后,让每列累计最小值进行比较,求出最小值,即得出结果。
-----------------------------------------

		代码:
		class Solution {
private int length;
public int minFallingPathSum(int[][] A) {
    length = A[0].length;
    int dp[][] = new int[length][length];
    for(int i=0; i<length; i++){
        for(int j=0; j<length; j++){
            minColumn(A, i, j, dp);                
        }
    }
    int min = dp[length-1][0];
    for(int i=0; i<length; i++){
        if(min > dp[length-1][i]){
            min = dp[length-1][i];
        }
    }
    return min;
}
public void minColumn(int[][] A, int i,int  j, int[][] dp){
    
    if( i<1 ){
        dp[i][j] = A[i][j];
    }else if(j<1){   
        dp[i][j] = min(dp[i-1][j], dp[i-1][j+1]) + A[i][j];
    }else if(j>length-2){
        dp[i][j] = min(dp[i-1][j-1],dp[i-1][j]) + A[i][j];
    }else{
        dp[i][j] = min( min(dp[i-1][j-1],dp[i-1][j]), dp[i-1][j+1] ) + A[i][j];
    }
    
}
int min(int a, int b){
    if(a>b){
        return b;
    }
    return a;
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值