1. 程式人生 > >114. 不同的路徑、115. 不同的路徑 II(動態規劃)

114. 不同的路徑、115. 不同的路徑 II(動態規劃)

解題思路

這是一道典型的動態規劃問題,使用一個二維陣列path記憶到達每一點可行的走法總數。首先將左邊界點和上邊界點初始化為1,因為機器人起始與(0,0),左邊界點和上邊界點的走法只有1種。接下來的每一點(i,j),可以由(i-1,j)向右走

或是(i,j-1)向下走來到達,因此在(i,j)這一點可到達的方法有path[i-1][j]+path[i][j-1]種,到達終點的方法則是path最後一個點的資料。有種遞迴的意思,不過這個是從終點向起點遞迴

程式碼:

class Solution {
public:
    /*
     * @param m: positive integer (1 <= m <= 100)
     * @param n: positive integer (1 <= n <= 100)
     * @return: An integer
     */
    int uniquePaths(int m, int n) {
        // write your code here
         if(m==0||n==0)
         return 0;
         vector<vector<int>>path(m,vector<int>(n,0));//定義一個m*n的二維陣列,並初始化為0
         for(int i=0;i<m;i++)
         path[i][0]=1;
         for(int j=0;j<n;j++)
         path[0][j]=1;
         for(int i=1;i<m;i++)
           for(int j=1;j<n;j++)
           path[i][j]=path[i-1][j]+path[i][j-1];
         return path[m-1][n-1];
    }
};
不同的路徑二

"不同的路徑" 的跟進問題:

現在考慮網格中有障礙物,那樣將會有多少條不同的路徑?

網格中的障礙和空位置分別用 1 和 0 來表示。

樣例

如下所示在3x3的網格中有一個障礙物:

[
  [0,0,0],
  [0,1,0],
  [0,0,0]
]

一共有2條不同的路徑從左上角到右下角。

思想:此題比不同的路徑1稍微複雜,其中添加了障礙物,障礙物要分兩種情況考慮

1、障礙物在邊界上,假設障礙物在[0,1]則障礙物以及障礙物後的點[0,2],[0,3]........均不能用,即都要path值都要設為0;

2、障礙物在內部,則只是此障礙物不能用,需要在求path總數的迴圈中判斷,並將其path值設為0;

注意,內部障礙物點在求path總數的迴圈中一定要做判斷,不然會出錯。如例題,path[1][1]本應等於0,若不判斷則其等於path[0][1]+path[1][0]=2;

class Solution {
public:
    /*
     * @param obstacleGrid: A list of lists of integers
     * @return: An integer
     */
    int uniquePathsWithObstacles(vector<vector<int>> &obstacleGrid) {
        // write your code here
        int m= obstacleGrid.size();//求二維陣列的行元素數
        int n= obstacleGrid[0].size();//求二維陣列的列元素數
        if(m==0||n==0)
        return 0;
        vector<vector<int>> path(m,vector<int>(n,0));
        if(obstacleGrid[0][0]==1)
        return 0;
        path[0][0]=1;
        //解決邊界障礙物
         for(int i=1;i<m;i++)
          {
              if (obstacleGrid[i][0]==1)
               path[i][0]==0; 
              else path[i][0]=path[i-1][0];
           }
          for(int j=1;j<n;j++)
          {
              if (obstacleGrid[0][j]==1)
               path[0][j]==0; 
              else path[0][j]=path[0][j-1];
          }
          //計算路徑總數
           for(int i=1;i<m;i++)
            {
                for(int j=1;j<n;j++)
                {
                  if(obstacleGrid[i][j]==1)//解決內部障礙物
                   path[i][j]=0; 
                  else 
                   path[i][j]=path[i-1][j]+path[i][j-1];
                 }
            }
       
             return path[m-1][n-1];
    }
};