zoukankan      html  css  js  c++  java
  • 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;
    
    
    
        }
    
    };
  • 相关阅读:
    python连接mysql数据库(MySQL)
    PHP+Redis 实例【一】点赞 + 热度 上篇
    linux centos7安装phpMyAdmin详解,以及解决各种bug问题
    Linux crontab命令 定时任务 用法详解以及no crontab for root解决办法
    composer安装教程 windows系统 | Linux系统 | mac系统
    CentOS 7.0下使用yum安装MySQL
    Linux PHP多版本切换 超简单办法
    tornado 入门
    Websocket、长连接、循环连接
    阻塞和非阻塞,同步和异步
  • 原文地址:https://www.cnblogs.com/zzw-/p/13435297.html
Copyright © 2011-2022 走看看