不同路径
简单动态规划
每一格只能由其上一格或者左一格走过来,也就是这两格已有的步数之和。于是有以下方程,能很好描述这种移动后的状态:
dp[i][j] = dp[i-1][j] + dp[i][j-1];
dp[i][0]、dp[0][j]都为边界条件,设置为1;
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> dp(m, vector<int>(n));
for(int i=0;i<m;i++){
dp[i][0] = 1;
}
for(int j=0;j<n;j++){
dp[0][j] = 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];
}
};
不同路径2
本题添加一部分限定条件,存在障碍物,但换汤不换药,思路还是跟上一题差不多。
主要注意在初始化边界条件时,不能全部设置为1,在边界的前一处存在障碍物时,是无法到达其下或其右的网格的。边界初始化定义为:
dp[0][0] = (ob[0][0]==1?0:1);
for(int i=1;i<m;i++){
if(ob[i][0]==1)
dp[i][0] = 0;
else
dp[i][0] = dp[i-1][0];
}
for(int j=1;j<n;j++){
if(ob[0][j]==1)
dp[0][j] = 0;
else
dp[0][j] = dp[0][j-1];
}
同时,在中间网格出现障碍物时,到达该处的步数应设置为0。
完整代码为:
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& ob) {
int m = ob.size();
int n = ob.empty()?0:ob[0].size();
vector<vector<int>> dp(m, vector<int>(n));
dp[0][0] = (ob[0][0]==1?0:1);
for(int i=1;i<m;i++){
if(ob[i][0]==1)
dp[i][0] = 0;
else
dp[i][0] = dp[i-1][0];
}
for(int j=1;j<n;j++){
if(ob[0][j]==1)
dp[0][j] = 0;
else
dp[0][j] = dp[0][j-1];
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
if(ob[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];
}
};