• 不同路径


    62. 不同路径

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

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

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

    img

    例如,上图是一个7 x 3 的网格。有多少可能的路径?

    示例 1:

    输入: m = 3, n = 2
    输出: 3
    解释:
    从左上角开始,总共有 3 条路径可以到达右下角。
    1. 向右 -> 向右 -> 向下
    2. 向右 -> 向下 -> 向右
    3. 向下 -> 向右 -> 向右
    

    示例 2:

    输入: m = 7, n = 3
    输出: 28
    
    #DFS
    # 超时
    def uniquepaths(m,n):
        stack = []
        stack.append([0,0])
        count = 0
        while stack:
            x,y = stack.pop()
            if (x,y) == (m-1,n-1):
                count += 1
            for dx,dy in ([1,0],[0,1]):
                if x+dx < m and y+dy<n:
                    stack.append([x+dx,y+dy])
        return count
    
    # 排列组合
    def uniquePaths(m,n):
        import math
        return int(math.factorial(m+n-2)/math.factorial(m-1)/math.factorial(n-1))
    
    
    # 动态规划
    def uniquePaths(m,n):
        dp = [[0]*m for _ in range(n)]
        for i in range(m):#第一行置一
            dp[0][i] = 1
        for i in range(n):#第一列置1
            dp[i][0] = 1
        for i in range(1,n):
            for j in range(1,m):
                dp[i][j] = dp[i-1][j] + dp[i][j-1]
        return dp[-1][-1]
    

    64. 最小路径和

    给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

    说明:每次只能向下或者向右移动一步。

    示例:

    输入:
    [
      [1,3,1],
      [1,5,1],
      [4,2,1]
    ]
    输出: 7
    解释: 因为路径 1→3→1→1→1 的总和最小。
    
    # 动态规划
    def minPathSum(grid):
        m,n = len(grid[0]),len(grid)
        dp = [[grid[0][0]]*m for _ in range(n)]
        for i in range(1,m):#第一行
            dp[0][i] = grid[0][i] + dp[0][i-1]
        for i in range(1,n):#第一列
            dp[i][0] = grid[i][0] + dp[i-1][0]
        for i in range(1,n):
            for j in range(1,m):
                dp[i][j] = min(dp[i-1][j],dp[i][j-1])+grid[i][j]
        return dp[-1][-1]
    
    # 动态规划  在原数组操作
    def minPathSum(grid):
        m,n = len(grid[0]),len(grid)
    
        for i in range(1,m):#第一行
            grid[0][i] = grid[0][i] + grid[0][i-1]
        for i in range(1,n):#第一列
            grid[i][0] = grid[i][0] + grid[i-1][0]
        for i in range(1,n):
            for j in range(1,m):
                grid[i][j] = min(grid[i-1][j],grid[i][j-1])+grid[i][j]
        return grid[-1][-1]
    
  • 相关阅读:
    Linux iptables 配置规则
    Java之品优购课程讲义_day06(7)
    TCP的三次握手与四次挥手
    区块链挖矿演变史,一键挖矿逐渐成主流
    Java KeyStore 用命令生成keystore文件
    SpringBoot | 第六章:常用注解介绍及简单使用
    PHP开发模式之-单例模式
    Ansible笔记
    CentOS7中搭建cobbler自动装机服务
    号称“新至强,可拓展,赢当下”的Xeon可拓展处理器有多逆天?
  • 原文地址:https://www.cnblogs.com/gongyanzh/p/12669797.html
Copyright © 2020-2023  润新知