【算法】矩陣的最小路徑和

題目

給定一個矩陣,從矩陣左上角開始走到右下角,每次只能向下或向右,將路徑上的數字求和,求所有路徑中路徑和最小的。

舉例

給定矩陣:
在這裏插入圖片描述
最短路徑如下:
在這裏插入圖片描述

解答

1.假設現在給定1*4的矩陣R:

在這裏插入圖片描述

設當前元素距離左上角的距離爲dp[0][i],那麼矩陣R的dp[0]如下:
在這裏插入圖片描述
則最小路徑和爲18

2.假設現在給定4*1的矩陣C:

在這裏插入圖片描述
設當前元素距離左上角的距離爲dp[i][0],那麼矩陣R的dp[i][0]如下:
在這裏插入圖片描述
則最小路徑和爲22

3.假設現在給定4*4的矩陣M:在這裏插入圖片描述

根據情況1、2很容易寫出第一行和第一列的dp值,如下:

在這裏插入圖片描述
此時很容易計算出左上角到達任意位置的最短路徑和
例如從左上角到第2行第2列(從1開始計數)的最小路徑和,只需取該元素的上面和左邊元素的最小路徑和與自己的值相加即可
易得狀態轉移方程:dp[i][j] = min(dp[i-1][j],dp[i][j-1])+M[i][j]
求出dp如下:
在這裏插入圖片描述
則最小路徑和爲12

代碼


public class Main {
    static Scanner in = new Scanner( System.in );
    public static void main(String[] args) {
        int row = in.nextInt();
        int col = in.nextInt();
        int[][] m = new int[row][col];
        int[][] dp = new int[row][col];
        dp[0][0] = m[0][0];
        for (int i = 1; i < col; i++) {
            dp[0][i] = dp[0][i-1] + m[0][i];
        }
        for (int i = 1; i < row; i++) {
            dp[i][0] = dp[i-1][0] + m[i][0];
        }
        for (int i = 1; i < row; i++) {
            for (int j = 1; j < col; j++) {
                dp[i][j] = Math.min( dp[i-1][j],dp[i][j-1] )+m[i][j];
            }
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章