• 无障碍型

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
    机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
    问总共有多少条不同的路径?

    图片说明
    解析:动态规划。1定义数组,dp[i][j]为机器人到i,j点的方法数。 2初始化,第一行的第一列只有一种方法,所以为1。 3递推关系dp[i][j]=dp[i-1][j]+dp[i][j-1]。终点是dp[m-1][n-1]

    class Solution {
      public int uniquePaths(int m, int n) {
          int dp[][] = new int[m][n];//dp[i][j]为左上角到i,j的路径数
          for(int i = 0;i<m;i++){
              for(int j = 0;j<n;j++){
                  if(i==0){
                      dp[0][j] = 1;
                  }else if(j==0){
                      dp[i][0] = 1;
                  }else{
                      dp[i][j] = dp[i][j-1]+dp[i-1][j]; 
                  }
              }
          }
          return dp[m-1][n-1];
    
      }
    }
  • 有障碍型

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
    机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
    现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
    有障碍的地方数字为1,没有则为0。规定所有遇到1的路径都作废

    解析:动态规划。1定义数组,dp[i][j]为机器人到i,j点的方法数。 2初始化,及递推关系。第一行第一列数字若为1,则直接返回0.否则,第一行其他列在遇到1后变为0,没遇到只有一种方法。其他行第一列在遇到1后变为0,没遇到只有一种方法。其他行其他列在遇到1后变为0,没遇到dp[i][j]=dp[i-1][j]+dp[i][j-1]。终点是dp[m-1][n-1]。

    class Solution {
      public int uniquePathsWithObstacles(int[][] obstacleGrid) {
          int m=obstacleGrid.length;
          if(m<1){
              return 0;
          }
          int n=obstacleGrid[0].length;
          if(n<1){
              return 0;
          }
          if(obstacleGrid[0][0]==1){
              return 0;
          }
          int[][] dp = new int[m][n];
          for(int i=0;i<m;i++){
              for(int j=0;j<n;j++){
                  if(i==0&&j==0){
                      dp[0][0]=1;
                  }else if(i==0&&j!=0){//第一行其他列
                      dp[i][j]=obstacleGrid[i][j]==1?0:dp[i][j-1];
                  }else if(i!=0&&j==0){//其他行第一列
                      dp[i][j]=obstacleGrid[i][j]==1?0:dp[i-1][j];
                  }else{//其他行其他列
                      dp[i][j]=obstacleGrid[i][j]==1?0:dp[i][j-1]+dp[i-1][j];
                  }
              }
          }
          return dp[m-1][n-1];        
      }
    }