動態規劃之(dp)——minimum-path-sum

題目描述
給定一個由非負整數填充的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
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Pq9RubaV-1585456077886)(BEDF081E1D834CEEBBB86B01ECAD0F67)]

有關動態規劃的一些知識

什麼是動態規劃?
    動態規劃又稱爲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];
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章