1. 程式人生 > >leetcode 64. 最小路徑和

leetcode 64. 最小路徑和

min pub urn div 得到 paths () cto ++

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

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

示例:

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


每次移動只能向右或者向下,所到達當前點,只能通過當前點的上面或者左邊到達, 因而,為了得到到當前點的最小路徑我們可以得到這樣的關系式dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j];
對於第一行的最小路徑只能是grid[0][0] 到 grid[i][0] 的和, 對於第一列的最小路徑只能是grid[0][0] 到grid[0][j]的和, 因為對與第一行和第一列而言都只能沿著直線到達;

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int i, j, x=grid.size(), y=grid[0].size();
        vector<vector<int>> dp(x, vector<int>(y, 0));
        dp[0][0] = grid[0][0];
        for(i=1; i<x; i++) dp[i][0] = dp[i-1][0] + grid[i][0];
        
for(j=1; j<y; j++) dp[0][j] = dp[0][j-1] + grid[0][j]; for(i=1; i<x; i++) for(j=1; j<y; j++) dp[i][j] = min(dp[i][j-1], dp[i-1][j]) + grid[i][j]; return dp[x-1][y-1]; } };

leetcode 64. 最小路徑和