iT邦幫忙

3

動態規劃經典題: 最短路徑之和

參考題目: 64. Minimum Path Sum

題目敘述,給你一個m*n陣列,每個格子都是非負整數,求從左上角走到右下角的最小數字和。
你每次只能往右或往下走一步,例子:

Input:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
Output: 7
Explanation: Because the path 1→3→1→1→1 minimizes the sum.

令給定陣列的名稱為grid
想法: 令DP[i][j] 表示以grid[i][j]的最短路徑之和,因為要走到(i, j)座標一定從(i-1, j)或(i, j-1)走過來,因此DP[i][j] = min(DP[i-1][j], DP[i][j-1]) + grid[i][j]

程式碼(c++):

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int R = grid.size();
        int C = grid[0].size();
        vector<vector<int>> DP(R, vector<int>(C, 0));
        
        DP[0][0]=grid[0][0];
        
        for (int i = 1; i < R; i++)
            DP[i][0] = DP[i-1][0] + grid[i][0]; 

        for (int j = 1; j < C; j++) 
            DP[0][j] = DP[0][j-1] + grid[0][j]; 


        for (int i = 1; i < R; i++)
            for (int j = 1; j < C; j++)
                DP[i][j] = min(DP[i-1][j], DP[i][j-1]) + grid[i][j]; 
  
        return DP[R-1][C-1]; 

    }
};

1 則留言

我要留言

立即登入留言