1. 程式人生 > >#動態規劃 LeetCode 64 最小路徑和

#動態規劃 LeetCode 64 最小路徑和

bsp length 位置 根據 說明 font span 輸入 思考

給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。

說明:每次只能向下或者向右移動一步。

示例:

輸入:
[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]
輸出: 7
解釋: 因為路徑 1→3→1→1→1 的總和最小。

思路:
  • 做動態規劃的題目還是習慣目的性的思考:找狀態轉移方程>明確函數定義>確定結果(過程)記錄數據結構。
  • 數據結構:既然題目給了一個二維數組記錄每一步,那麽很自然的,我們也可以使用一個同樣大小的二維數組記錄到當前位置所要步驟。
  • 函數定義:確定每個位置所需步數。
  • 狀態轉移方程:F(i,j) = F(i+1,j) +F(i,j+1)分別對應下和右。
  • 最小子問題為F(m-1,n-1) = grid(m-1, n-1)
  • 另外記得邊界是沒有下或者右的。
  • 根據狀態轉移方程,叠代即可求出結果。



class Solution {
    public int minPathSum(int[][] grid) {
        int m = grid.length;
        if(m ==0)
            return 0;
        int n = grid[0].length;
        
        for(int i = m-1 ; i>= 0 ;i--)
            for( int j = n-1 ; j>=0 ; j--){
                
if(i == m-1){ if(j!=n-1) grid[i][j] = grid[i][j]+grid[i][j+1]; } else{ if(j!=n-1) grid[i][j] = grid[i][j] + (int)Math.min(grid[i][j+1],grid[i+1][j]); else grid[i][j]
= grid[i][j] + grid[i+1][j]; } } return grid[0][0]; } }

#動態規劃 LeetCode 64 最小路徑和