題目
給定一個矩陣,從矩陣左上角開始走到右下角,每次只能向下或向右,將路徑上的數字求和,求所有路徑中路徑和最小的。
舉例
給定矩陣:
最短路徑如下:
解答
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];
}
}
}
}