• 动态规划 Ⅱ


    62. 不同路径

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

    机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

    问总共有多少条不同的路径?

    思路:dp[i][j] = dp[i-1]dp[j] + dp[ i] + dp[j-1],  dp[i][j] = 0 when i=0 or j = 0. dp数组可优化为滚动数组

    python,滚动数组

    1. class Solution:
    2. def uniquePaths(self, m: int, n: int) -> int:
    3. dp = [1 for _ in range(n)]
    4. for i in range(1, m):
    5. for j in range(1,len(dp)):
    6. dp[j] += dp[j-1]
    7. return dp[-1]

    63. 不同路径 II

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

    机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。

    现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

    网格中的障碍物和空位置分别用 1 和 0 来表示。

    思路,转移方程与不同路径Ⅰ类似,但是要注意障碍物的存在,dp数组时,对应的位置置为0,且dp数组不会在这个位置上更新。初始第一行或第一列时,遇到障碍物后面的位置默认置零。

    python:二维数组

    1. class Solution:
    2. def uniquePathsWithObstacles(self, obstacleGrid):
    3. m = len(obstacleGrid)
    4. n = len(obstacleGrid[0])
    5. if obstacleGrid[m - 1][n - 1] == 1 or obstacleGrid[0][0] == 1:
    6. return 0
    7. dp = [[0] * n for _ in range(m)]
    8. for i in range(m):
    9. if obstacleGrid[i][0] == 0: # 遇到障碍物时,直接退出循环,后面默认都是0
    10. dp[i][0] = 1
    11. else:
    12. break
    13. for j in range(n):
    14. if obstacleGrid[0][j] == 0:
    15. dp[0][j] = 1
    16. else:
    17. break
    18. for i in range(1, m):
    19. for j in range(1, n):
    20. if obstacleGrid[i][j] == 1:
    21. continue
    22. dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
    23. return dp[m - 1][n - 1]

    Python:滚动数组

    1. class Solution:
    2. def uniquePathsWithObstacles(self, obstacleGrid):
    3. if obstacleGrid[0][0] == 1:
    4. return 0
    5. m, n = len(obstacleGrid), len(obstacleGrid[0])
    6. dp = [0] * n
    7. # 初始化第一行的路径数
    8. for j in range(n):
    9. if obstacleGrid[0][j] == 1:
    10. break
    11. dp[j] = 1
    12. # 计算其他行的路径数,根据障碍物的dp数组修改优先级最高
    13. for i in range(1, m):
    14. if obstacleGrid[i][0] == 1:
    15. dp[0] = 0
    16. for j in range(1, n):
    17. if obstacleGrid[i][j] == 1:
    18. dp[j] = 0
    19. continue
    20. dp[j] += dp[j - 1]
    21. return dp[-1] # 返回最后一个元素,即终点的路径数

  • 相关阅读:
    Kaadas凯迪仕助力亚运盛会,尽展品牌硬核科技与智能锁行业风采
    Hashtable为什么效率很低
    【k8s管理操作】
    卡尔曼滤波(Kalman Filter)原理浅析-数学理论推导-2
    SPARK中的wholeStageCodegen全代码生成--以aggregate代码生成为例说起(8)
    Java学习笔记——字符串
    《大数据之路:阿里巴巴大数据实践》-第1篇 数据技术篇 -第3章数据同步
    【On Nacos】SpringCloud 方式使用 Nacos
    企业如何成功完成云迁移?
    Java CC 解析 SQL 语法示例
  • 原文地址:https://blog.csdn.net/Atuosi/article/details/132870831