当前位置:   article > 正文

代码随想录算法训练营Day39 | 62.不同路径、63. 不同路径 II

代码随想录算法训练营Day39 | 62.不同路径、63. 不同路径 II

62.不同路径

思路比较简单,因为机器人只能向右和向下走,所以走到一个格子的方法等于到达其上方格子的方法加上到达其左方格子的方法

1、DP数组定义:二维DP数组,dp[i][j]表示到达行 i 列 j 格子的方法数

2、DP数组初始化:首行和首列元素初始化为1,其他元素随意

3、递推公式:走到一个格子即走到其上方格子再向下走一步,或走到其左方格子再向右走一步,所以:dp[i][j] = dp[i - 1][j] + dp[i][j - 1]

4、遍历顺序:因为是向右、向下走,所以从上往下、从左向右遍历

  1. int uniquePaths(int m, int n) {
  2. // dp[i][j]数组表示到达该格子的方法数,首行和首列元素初始化为1
  3. vector<vector<int>> dp(n, vector<int>(m, 1));
  4. // 从上往下、从左向右遍历
  5. for (int i = 1; i < n; ++i) {
  6. for (int j = 1; j < m; ++j) {
  7. dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
  8. }
  9. }
  10. return dp[n - 1][m - 1];
  11. }

63. 不同路径 II

与62不同路径主要思路一样,差别主要在于初始化以及递推处的分支处理

DP数组初始化:首行与首列如果出现障碍物,其后的行/列都初始化为0,否则初始化为1

递推公式:有障碍时dp[i][j]设置为0(一方面表示没有方法能到达该格子,一方面表示无法从该格子出发向右或向下到达其他格子),否则dp[i][j] = dp[i - 1][j] + dp[i][j - 1]

  1. int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
  2. int n = obstacleGrid.size();
  3. int m = obstacleGrid[0].size();
  4. vector<vector<int>> dp(n, vector<int>(m, 1));
  5. // 首行与首列如果出现障碍物,其后的行/列都初始化为0,否则初始化为1
  6. bool isObstructed = false;
  7. for (int i = 0; i < n; ++i) {
  8. if (obstacleGrid[i][0] == 1) isObstructed = true;
  9. if (isObstructed) dp[i][0] = 0;
  10. }
  11. isObstructed = false;
  12. for (int j = 0; j < m; ++j) {
  13. if (obstacleGrid[0][j] == 1) isObstructed = true;
  14. if (isObstructed) dp[0][j] = 0;
  15. }
  16. // 从上往下、从左向右遍历
  17. for (int i = 1; i < n; ++i) {
  18. for (int j = 1; j < m; ++j) {
  19. // 有障碍时dp[i][j]设置为0
  20. dp[i][j] = obstacleGrid[i][j] ? 0 : dp[i - 1][j] + dp[i][j - 1];
  21. }
  22. }
  23. return dp[n - 1][m - 1];
  24. }

好像有点感觉了,大致思路就是从题意中获取状态转移方法,遍历顺序和状态转移的过程也存在一定关系 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/212001
推荐阅读
相关标签
  

闽ICP备14008679号