题目描述链接: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; } };