題目描述
給定一個由非負整數填充的m x n的二維數組,現在要從二維數組的左上角走到右下角,請找出路徑上的所有數字之和最小的路徑。
注意:你每次只能向下或向右移動。
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.
Note: You can only move either down or right at any point in time
有關動態規劃的一些知識
什麼是動態規劃?
動態規劃又稱爲dp,就是利用歷史數據,來避免我們的重複計算。
這些歷史數據,我們要用一些變量來保存,一般是用一維數組或者是二維數組來保存
動態規劃很重要的三個步驟
1.定義數組元素的定義,上面說了,我們將使用一個數組,保存歷史數據。假設我們就用一維數組dp[]吧。
這個時候有一個很重要的點,就是規定你數組元素的含義,就是說你的dp[i]究竟是代表什麼含義
2.找出數組元素之間的關係式。就是說你的dp[n]是可以根據歷史的數據得到的。
比如我的dp[n]=dp[n-1]+dp[n-2].
3.找出初始值。
很明顯。在上面我說的dp[n]=dp[n-1]+dp[n-2]。我們可以通過dp[n-1]和dp[n-2]來計算dp[n].最終我們會推到dp[3]=dp[2]+dp[1],這裏的dp[1]和dp[2]是不可以再分解下去了,即我們常說的初始值。
思路
1.我們定義dp[i][j]表示從dp[0][0]到dp[i][j]路徑上所有數字最小之和。
2.dp[i][j]無非就是從上或者從左邊走過來的,即dp[i][j]=dp[i][j]+min{dp[i-1][j],dp[i][j-1]}
3.確定初始值
3.1對於最左的dp[i][0]來說只能從dp[i-1][0]走過來的
3.2對於最上的dp[0][j]來說只能從dp[0][j-1]走過來的
根據題目意思,最上和最左即grid[0][i]+=grid[i-1][0]和grid[j][0]+=grid[j-1][0]
對於grid[i][j]=grid[i][j]+grid[i-1][j]或者grid[i][j]=grid[i][j]+grid[i][j-1];
public class Solution {
public int minPathSum(int[][] grid) {
int m=grid.length;
int n=grid[0].length;
for(int i=1;i<m;i++){
grid[i][0]=grid[i][0]+grid[i-1][0];
}
for(int i=1;i<n;i++){
grid[0][i]=grid[0][i]+grid[0][i-1];
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
grid[i][j]+=Math.min(grid[i-1][j],grid[i][j-1]);
}
}
return grid[m-1][n-1];
}
}