动态规划基础题型—二维数组,python版本

文章讲述了使用动态规划求解两种路径问题:1)网格中找到从左上角到右下角的唯一路径数量;2)考虑障碍物的情况下,找出可到达目标的路径数量。通过对dp数组的初始化和递推公式进行设定,解决了这两类问题。

动规五部曲:

  1. 确定dp数组以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

不同路径

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        dp = [[0 for i in range(n)] for j in range(m)]

        for i in range(0, n):  # 第1行应该都只有一条路径
            dp[0][i] = 1
        
        for i in range(0, m):  # 第1列应该都只有一条路径
            dp[i][0] = 1

        for i in range(1, m):
            for j in range(1, n):
                dp[i][j] = dp[i][j - 1] + dp[i - 1][j]
        return dp[m - 1][n - 1]

不同路径二

class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
        m = len(obstacleGrid)
        n = len(obstacleGrid[0])

        dp = [[0 for i in range(n)] for j in range(m)]

        for i in range(0, n):  # 初始化行
            if obstacleGrid[0][i] == 1:  # 如果遇到石头,后面的应该都不可走
                dp[0][i] = 0
                break
            else:   # 否则可走初始化为1
                dp[0][i] = 1
        
        for i in range(0, m):  # 初始化列
            if obstacleGrid[i][0] == 1:  # 如果遇到石头,后面的应该都不可走
                dp[i][0] = 0
                break
            else:  # 否则可走初始化为1
                dp[i][0] = 1

        for i in range(1, m):
            for j in range(1, n):
                if obstacleGrid[i][j] == 1:
                    dp[i][j] = 0 # 有石头,则表示不可达
                else:
                    dp[i][j] = dp[i][j - 1] + dp[i - 1][j]
        
        return dp[m - 1][n - 1]
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值