63.不同路径
dp问题描述
62.不同路径
确定本题的状态表示
dp[i][j]表示的是从最左上角移动到(i,j)
位置的路径总数
确定本题的状态转移方程
根据已知条件:dp[1][1]=1
这个题目我们要考虑障碍物,因此下面就(i,j)
位置附近有没有障碍物做分类讨论
- 如果
(i-1,j)
处是障碍物,那么dp[i][j]=dp[i][j-1]
- 如果
(i,j-1)
处是障碍物,那么dp[i][j]=dp[i-1][j]
- 如果
(i-1,j)和(i,j-1)
处都没有障碍物,
则:dp[i][j]=dp[i-1][j]+dp[i][j-1]
当然在实现的时候我们可以对它进行一个优化。是遇到有障碍物的位置,我们就对它不做处理,即到达这个位置的路径为零。然后后面无论(i,j)
位置附近有没有障碍物,dp[i][j]都可以根据下面的递推公式来计算dp[i][j]=dp[i-1][j]+dp[i][j-1]
填表求值
根据初始条件和状态转移方程,确定填表顺序,进而逐步填满dp表,最终返回题目要的结果
代码实现
class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m=obstacleGrid.size();if(m==0) return 0;int n=obstacleGrid[0].size();vector<vector<int>> dp(m+1,vector<int>(n+1,0));if(obstacleGrid[0][0]==0)dp[1][1]=1;cout << m<< " "<< n<<endl;for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(i==1&&j==1) continue;if(obstacleGrid[i-1][j-1]==1) continue;dp[i][j]=dp[i-1][j]+dp[i][j-1];}}return dp[m][n];}
};