不同路径
分析:
动态规划五部曲:
1、确定dp数组以及下标的含义
这题明显应用二维数组(好像可用滚动数组将二维变一维),dp[i][j]在此处定义为从方格(0,0)走至方格(i,j)的不同路径数
2、确定递推公式
由题意:方格(i,j)可由方格(i-1,j)向下走一步或者由方格(i,j-1)向右走一步得到,因而:
dp[i][j] = dp[i-1][j]+dp[i][j-1];
3、如何初始化
显然:方格第一列和第一行的格子都只能由(0,0)方格一直向下或者向右走得到,故有:
dp[0][j] = 1;
dp[i][0] = 1;
4、确定遍历顺序:从左到右一层一层遍历 i和j从1开始
5、举例推导:以示例中m为3,n为2(所求为dp[m-1][n-1])推导如下
dp[1][1] = dp[0][1] + dp[1][0] = 2;
//所求
dp[2][1] = dp[1][1] + dp[2][0] = 3;
题解:
class Solution {
public:
int uniquePaths(int m, int n) {
//先考虑m和n的最小情况
if(m == 1|| n==1){
//均只有1条路可走
return 1;
}
//dp数组 dp[i][j]代表从(0,0)方格走至(i,j)方格的不同路径数
vector<vector<int>> dp(m,vector<int>(n));
//初始化 第一行和第一列均为1
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];
}
};
不同路径II
分析:
动态规划五部曲:
1、确定dp数组以及下标的含义
同上,dp[i][j]在此处定义为从方格(0,0)走至方格(i,j)的不同路径数
2、确定递推公式
同上,方格(i,j)可由方格(i-1,j)向下走一步或者由方格(i,j-1)向右走一步得到,因而:
dp[i][j] = dp[i-1][j]+dp[i][j-1];
3、如何初始化
同上,方格第一列和第一行的格子都只能由(0,0)方格一直向下或者向右走得到,但本题增设了障碍,那么初始化时就应该考虑到障碍物,障碍物方格的dp值应该为0 ,且第一行和第一列若有障碍物方格,在其之后的方格dp值也应为0,因为这些方格永远不能到达,故有:
//第一列 循环终止条件为 一旦出现障碍物1 便终止
for(int i = 0;i<m && obstacleGrid[i][0] == 0;i++){
dp[i][0] = 1;
}
//第一行
for(int j = 0;j<n && obstacleGrid[0][j] == 0;j++){
dp[0][j] = 1;
}
4、确定遍历顺序:从左到右一层一层遍历 i和j从1开始
5、举例推导:以示例中m为2,n为2(所求为dp[m-1][n-1])推导如下
//所求 dp[0][1] = 0;该方格是障碍物
dp[1][1] = dp[0][1] + dp[1][0] = 1;
题解:
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
//多了障碍物的区别是什么呢 就是dp[障碍物]应赋值为0 且第一行和第一列在障碍物之后的方格也应赋值为0
//首先获得方格的行数和列数
int m = obstacleGrid.size();
int n = obstacleGrid[0].size();
//如果终点是障碍物 则返回0
if(obstacleGrid[m-1][n-1] == 1){
return 0;
}
//定义dp数组
vector<vector<int>> dp(m,vector<int>(n,0));
//第一行和第一列在障碍物之后的方格dp赋值为0
//第一列 循环终止条件为 一旦出现障碍物1 便终止
for(int i = 0;i<m && obstacleGrid[i][0] == 0;i++){
dp[i][0] = 1;
}
//第一行
for(int j = 0;j<n && obstacleGrid[0][j] == 0;j++){
dp[0][j] = 1;
}
//计算dp数组
//遍历
for(int i = 1;i<m;i++){
for(int j = 1;j<n;j++){
//非障碍物才赋值 障碍物不管 初值就为0
if(obstacleGrid[i][j] == 0){
dp[i][j] = dp[i-1][j]+dp[i][j-1];
}
}
}
return dp[m-1][n-1];
}
};