1. 程式人生 > >[leetcode 64] Minimum Path Sum------從左上角到右下角的最小路徑值

[leetcode 64] Minimum Path Sum------從左上角到右下角的最小路徑值

Question:

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.

分析:

題目意思是一個m*n的矩陣,求從左上角到右下角的最短路徑,只能向右走或是向下走。這道題跟機器人從左上角到右下角的路徑數目題類似,但是解法不能相同,如果仍舊採用遞迴法,速度會很慢,超時。

這道題的思路是採用動態規劃法分析,需要一個輔助陣列,無論在哪個位置,如何走到這個點,都記錄如果走到了這個點為止的路徑的最小值。

可以知道,如果走第一行或第一列,就是依次與前面的數相加。第i行第j列時候,就要考慮是從上面點走過來的還是從左邊點走過來,取其中最小值即可。

最後一個數據即為到右下角時候的路徑最小值。

程式碼如下:

<span style="font-size:14px;">class Solution {
public:
    //vector<int> s;
    //int min = INT_MAX;
public:
    int minPathSum(vector<vector<int>>& grid) {
        if(grid.size() == 0)
            return 0;
        else{
            if(grid[0].size() == 0)
                return 0;
        }
        vector<vector<int>> min_path(grid);
        for(int i = 1; i < grid.size(); ++i){
            min_path[i][0] += min_path[i-1][0];
        }
        for(int i = 1; i < grid[0].size(); ++i){
            min_path[0][i] += min_path[0][i-1];
        }
        for(int i = 1; i < grid.size(); ++i){
            for(int j = 1; j < grid[0].size(); ++j){
                min_path[i][j] += min(min_path[i-1][j],min_path[i][j-1]);
            }
        }
        return min_path[ grid.size()-1][grid[0].size()-1];
        
       
        /*int sum = 0;
        helper(grid,0,0,0,min);
        return min;*/
        
    }
    //遞迴方法,時間超時
   /* void helper(vector<vector<int>>& grid,int startm,int startn,int sum,int& min){
        if(sum > min){
            return;
        }
        if((grid.size()-startm) == 1){
            for(int i  = startn; i < grid[startm].size(); ++i){
                sum += grid[startm][i];
            }
                if(min > sum)
                    min = sum;
        }
        else{
            if((grid[0].size()-startn) == 1){
                for(int i = startm; i < grid.size(); ++i){
                    sum += grid[i][startn];
                }
                //s.push_back(sum);
                //return sum;
                if(min > sum)
                    min = sum;
            }
            else{
               // int left,down;
               if(grid.size() > startm+1)
                    helper(grid,startm+1,startn,sum+grid[startm][startn],min);
                if(grid[0].size() > startn+1)
                    helper(grid,startm,startn+1,sum+grid[startm][startn],min);
                
            }
        }
    }*/
};</span>