LeetCode63——Unique Paths II
跟LeetCode62——Unique Paths不同的是,这里是要在路径上设置障碍的。
因此不能用组合的方法去做了(也许可以,但我实在想不到)
那就是传统二维数组的动态规划了。
定义动归方程如下:
首先 dp[i][j]表示到 点 (i,j) 路径的可能数,那么假设不存在障碍的情况下,则有:
dp[i][j]=dp[i-1][j] + dp[i][j-1] 因为他可以从两个不同的方向走到(i,j)处。
现在考虑障碍,如果 (i,j) 处有障碍,即值为1。那么不论dp[i-1][j] 和 dp[i][j-1]为多少,dp[i][j]恒为0
所以就有:
dp[i][j]=dp[i-1][j] + dp[i][j-1] map[i][j]=0
dp[i][j]=0 map[i][j]=1
最后要注意的就是(0,1) (1,0)这样的边界条件
代码:
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m = obstacleGrid.size();
int n = obstacleGrid[0].size();
if (m == 0 || n == 0)
return 0;
vector<vector<int>>dp(m, vector<int>(n));
dp[0][0] = obstacleGrid[0][0] == 1 ? 0 : 1;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (i >= 1 && j >= 1)
{
if (obstacleGrid[i][j] == 0)
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
else
dp[i][j] = 0;
}
else if (i >= 1)//考虑边界条件
{
if (obstacleGrid[i][j] == 0)
dp[i][j] = dp[i - 1][j];
else
dp[i][j] = 0;
}
else if (j >= 1)//考虑边界条件
{
if (obstacleGrid[i][j] == 0)
dp[i][j] = dp[i][j - 1];
else
dp[i][j] = 0;
}
}
}
return dp[m - 1][n - 1];
}
};