dp问题描述
确定本题的状态表示
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];
}
};


被折叠的 条评论
为什么被折叠?



