1. 程式人生 > >【LeetCode】64 最小路徑和 (C++)

【LeetCode】64 最小路徑和 (C++)

題目描述:

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

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

示例:

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

解題方案:

很經典的一道動態規劃的題,沒什麼要注意的地方。

程式碼:

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        vector<vector<int>> sum;
        int m = grid.size();
        if(m == 0)
            return 0;
        int n = grid[0].size();
        sum.resize(m);
        for(int i = 0; i < m; i ++)
            sum[i].resize(n);
        sum[0][0] = grid[0][0];
        for(int i = 0; i < m; i ++)
            for(int j = 0; j < n; j ++)
            {
                if(i == 0 && j != 0)
                    sum[i][j] = sum[i][j - 1] + grid[i][j];
                else if(i != 0 && j == 0)
                    sum[i][j] = sum[i - 1][j] + grid[i][j];
                else if(i != 0 && j != 0)
                {
                    int d = sum[i][j - 1] < sum[i - 1][j] ? sum[i][j - 1] : sum[i - 1][j];
                    sum[i][j] = d + grid[i][j];
                }
            }
        return sum[m - 1][n - 1];
    }
};