LeetCode 08.02. 迷路的机器人(解法二)

题目描述链接:https://leetcode-cn.com/problems/robot-in-a-grid-lcci/

解题思路:再上一篇博客中用了DFS进行了求解,此文中使用动态规划,记录如下(参考有LeetCode题解区和评论区)。

通过dp来记录节点能否到达终点,可以这样考虑,如果起点能够到达终点,那么终点也能够到达起点,那么每个节点就要

能够到达其左方或者上方的节点的,最终能够从终点沿着此条路径到达起点。但我们并不需要从终点开始dp而是判断除了首行

和首列的节点外,其它节点能否到达其上方节点或左方节点,如果可以就最终能够找到终点。最后我们从终点寻找到起点路径

返回即可;

(1)状态描述:  dp[i][j]=1表示{i,j}可以到达终点,dp[i][j]=0表示不可到达。

 (2)边界:如果{0,0}不为1,dp[0][0]=1,为0的话直接返回不可到达。第一行如果{0,i}==0  dp[0][i]=dp[0][i-1],否则dp[0][i]=0。

     第一列:如果{i,0}==0 dp[i][0]=dp[i-1][0],否则dp[i][0]=0。

(3)状态转移方程:如果{i,j}==0  dp[i][j]=max(dp[i-1][j],dp[i][j-1]) , 否则dp[i][j]=0。

最后LeetCode C++参考代码如下:

class Solution {
public:
    vector<vector<int>>res;
    bool vis[105][105];
    bool flag;
    vector<vector<int>> pathWithObstacles(vector<vector<int>>& obstacleGrid) {
          int m=obstacleGrid.size();
          int n=obstacleGrid[0].size();
          vector<vector<int>>res;
          if(m==0||n==0){
              return res;
          }
          if(obstacleGrid[0][0]==1||obstacleGrid[m-1][n-1]==1){
              return res;
          }
          

          int dp[m][n];
          dp[0][0]=1;
          for(int i=1;i<m;i++){
              if(obstacleGrid[i][0]==0)
                 dp[i][0]=dp[i-1][0];
               else
                  dp[i][0]=0;
          }
          for(int i=1;i<n;i++){
              if(obstacleGrid[0][i]==0)
                 dp[0][i]=dp[0][i-1];
              else
                 dp[0][i]=0;
          }
          for(int i=1;i<m;i++){
              for(int j=1;j<n;j++){
                  if(obstacleGrid[i][j]==0)
                     dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
                   else
                      dp[i][j]=0;
              }
          }


          if(dp[m-1][n-1]==0){
              return res;
          }
          int row=m-1;
          int col=n-1;
          int up,left;
          while(row>0||col>0){
              up=0;
              left=0;
              res.push_back({row,col});
              if(row>0){
                  if(dp[row-1][col]==1){
                      up=1;
                  }
              }
              if(col>0){
                  if(dp[row][col-1]==1){
                      left=1;
                  }
              }
              if(up>=left){
                  row-=1;
              }
              else{
                  col-=1;
              }

          }
          res.push_back({0,0});
          reverse(res.begin(),res.end());
          
          return res;



    }

};
原文地址:https://www.cnblogs.com/zzw-/p/13435297.html