Leetcode Minimum Path Sum

OpenSoucre發表於2014-06-22

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.

做這題之前,建議先看一下Leetcode Triangle

這題看懂了,然後把矩陣右旋45度後,再看此題感覺很相似,

把斜次對角線(包括主對角線)看成行,然後按照Leetcode Triangle的思路去做即可

如矩陣(矩陣的行數為n,矩陣的列數為m)

1 1 1 1

1 1 1 1

1 1 1 1

1 1 1 1

對於每一行分別對於原始矩陣列的第1~m個元素

決策變數為dp[i][j], 表示左上角到達第i行第j個元素最短路徑

動態轉移方程為dp[i][j] = min(dp[i][j-1],dp[i-1][j]) + grid[i][j]

由於二維陣列空間比較大,本題對空間進行優化

 

矩陣旋轉45度後為

       1

     1   1

   1  1  1

1   1   1   1

   1   1   1

     1   1

       1

你會發現dp[i][j-1]和dp[i-1][j]處在同一行的相領元素,而他們之間下面的元素為dp[i][j],就類似Leetcode Triangle

由於上一行的資訊在下一行後不會用到,故利用滾動陣列的去解決

int minPathSum(vector<vector<int> >& grid){
    if(grid.empty()) return 0;
    int n = grid.size(), m = grid[0].size();
    vector<int> dp(m+1,INT_MAX);
    dp[1] = 0;
    for(int i = 0 ; i < n; ++ i){
        for(int j = 0; j < m ; ++ j){
            dp[j+1] = min(dp[j],dp[j+1]) + grid[i][j];
        }
    }
    return dp[m];
}

 

 

相關文章