62.不同路径
int uniquePaths(int m, int n) {
vector<vector<int>> dp(m, vector<int>(n, 0));
//初始化
dp[0][0] = 0;
for (int i = 0; i < n; i++) dp[0][i] = 1;
for (int i = 0; i < m; i++) dp[i][0] = 1;
//推导
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
return dp[m-1][n-1];
}
比较简单,dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。初始化时,将第一行和第一列都初始化为1,然后推导的过程中当前网格的路径数量就是其左边和上边的路径数量总和,根据这个推到公式即可推出到终点的路径数量!
63. 不同路径 II
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m = obstacleGrid.size();
int n = obstacleGrid[0].size();
vector<vector<int>> dp(m, vector<int>(n, 0));
//初始化
dp[0][0] = 0;
for (int i = 0; i < n && obstacleGrid[0][i] == 0; i++)
dp[0][i] = 1;
for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++)
dp[i][0] = 1;
//推导
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (obstacleGrid[i][j] == 0)
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
return dp[m-1][n-1];
}
这道题与上道题类似,只是加入了障碍。不同的地方在于初始化和推导的过程中:
初始化:在初始化的过程中,如果第一行或第一列遇到了障碍,那这一行或这一列后面的所有地方都不应该到达,因此要在遍历的条件中加入&& obstacleGrid[0][i] == 0,当遇到障碍时停止初始化,又由于dp数组一开始都初始化为0了,障碍物后面的地方也都会是0满足要求。
推导过程中:如果遇到障碍了,就不需要进行推导,保持初始化的0即可。然后后面推导的过程中就相当于避开了障碍的这条路径,只计算了没有障碍的那条路径!