第一题:
思路:
动态规划:
首先确定dp[i][j]是什么定义:表示下标为i,j的位置上有dp[i][j]条路径。
由题目可以知道dp[i][j]是什么推导来的,由于机器人智能向下或者向右移动一步,因此只能左边和上面移动而来。因此递推表达式如下:
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
初始化:第一行和第一列初始化为1。因为第一行和第一列的位置都是只有一条路径能到达。
遍历顺序:从dp[1][1]开始遍历。
代码如下:
class Solution {
public:
int uniquePaths(int m, int n) {
if(m == 0 && n == 0) return 0;
vector<vector<int>> dp(m, vector<int>(n, 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];
}
};
第二题:
原题链接:63. 不同路径 II - 力扣(LeetCode)
思路:
跟上一道很相似,只有细微的差别,注意两点:
1.初始化的时候遇到障碍之后剩下没有置为1的位置就不能置为1了。
2.在遍历过程中遇到障碍的位置dp[i][j]置为0;
代码如下:
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m = obstacleGrid.size(), n = obstacleGrid[0].size();
if(m == 0 && n == 0) return 0;
vector<vector<int>> dp(m, vector<int>(n, 0));
for(int i = 0; i < m; i++){
if(obstacleGrid[i][0] == 0){
dp[i][0] = 1;
}else{
break;
}
}
for(int i = 0; i < n; i++){
if(obstacleGrid[0][i] == 0){
dp[0][i] = 1;
}else{
break;
}
}
for(int i = 1; i < m; i++){
for(int j = 1; j < n; j++){
if(obstacleGrid[i][j] == 1){
dp[i][j] = 0;
}else{
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
}
return dp[m - 1][n - 1];
}
};