1. 程式人生 > >Leetcode題解系列——64. Minimum Path Sum(c++版)

Leetcode題解系列——64. Minimum Path Sum(c++版)

題目連結:64. Minimum Path Sum

題目大意:給出一個矩陣,現在想尋求一條從最左上元素到達最右下的最短路徑,且只能向下走或者向右走兩種途徑。

一.演算法設計

這也是一道典型的動態規劃題目,我設計狀態為sum[ i ][ j ] 表示為第i行第j列到達該點的最短長度。現在想求sum[row - 1][col -1]的值。

狀態轉移方程:

  • 向右走: sum[i][j] = sum[i-1][j] + grid[i][j]
  • 向下走:sum[i][j] = sum[i][j-1] + grid[i][j]
    最後sum[i][j]取上述兩值的最小值即可
    ,這樣的演算法複雜度為O(M*N)

注意點:

  1. 注意初始化第一個位置的距離,即sum[0][0]
  2. 注意判斷是否越界
  3. 初始化temp的值,不然取最小值的時候會出現錯誤,變為0.

二.演算法實現

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int col = grid[0].size();
        int row = grid.size();
        int sum[row][col] = {0};
sum[0][0] = grid[0][0]; for(int i = 0; i < row; i ++){ for(int j = 0; j < col; j++){ if(i == 0 && j == 0) continue; int temp1 = 999,temp2 = 999; // right if(i-1 >= 0) temp1 = sum[i-
1][j] + grid[i][j]; // bottom if(j-1 >= 0) temp2 = sum[i][j-1] + grid[i][j]; sum[i][j] = min (temp1,temp2); } } return sum[row-1][col-1]; } };