zoukankan      html  css  js  c++  java
  • 动态规划(1)

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

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

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

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

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/unique-paths
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    class Solution(object):
        def uniquePaths(self, m, n):
            dp = [[0 for _ in range(n)] for _ in range(m)]
            
            dp[0][0] = 0
            for i in range(m):
                dp[i][0] = 1
            for j in range(n):
                dp[0][j] = 1
            
            for i in range(1, m):
                for j in range(1, n):
                    dp[i][j] = dp[i-1][j] + dp[i][j-1]
            return dp[-1][-1]
    View Code
    class Solution(object):
        def uniquePaths(self, m, n):
            """
            :type m: int
            :type n: int
            :rtype: int
            """
            # 采用二位数组形式的动态规划
            # f[i][j]表示当前移动到的总次数,要求f[-1][-1]
            # 状态转移公式:f[i][j] = f[i-1][j]+f[i][j-1]
            # 初始值:每一步移动的次数可以看做横轴和纵轴的和,因此 f[i][0] = 1,f[0][j]=1
            # 运动的轨迹:要么往下,要么往左
            # 时间复杂度:O(m*n),空间复杂度:O(m*n)
            
            f = [[0]*n for zong in range(m)]
            for i in range(m):
                f[i][0] = 1
            for j in range(n):
                f[0][j] = 1
            for i in range(1,m):
                for j in range(1,n):
                    f[i][j] = f[i-1][j]+f[i][j-1]
            return f[-1][-1]
            
    
            """优化空间复杂度为O(n)"""
            # 对二维矩阵进行压缩成一位数组,将最新生成的值覆盖掉旧的值,逐行求解当前位置的最新路径条数!
            # 实质:在于动态计算并替换当前位置下的路径数最新值
            # 状态转移公式变成:f[i] = f[i-1]+f[i]
            # 初始值: f = [1]*m,取横轴
            # f[-1]表示可能路径的总数
            # 空间复杂度:O(n),时间复杂度:O(m*n)
    
            f = [1]*m
            for j in range(1,n):
                for i in range(1,m):
                    f[i] = f[i-1]+f[i]
            return f[-1]
    
    作者:yu-fa-tang-you-dian-tian
    链接:https://leetcode-cn.com/problems/unique-paths/solution/dong-tai-gui-hua-ya-suo-shu-zu-you-hua-kong-jian-f/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    View Code
    纯数学:排列组合
    标准组合公式:C(n-1,m+n-2)
    
    代码
    class Solution:
        def uniquePaths(self, m: int, n: int) -> int:
            a=b=1
            for i in range(1,n):
                a=a*i
            for i in range(m,m+n-1):
                b=b*i
            return b//a
    
    作者:jutraman
    链接:https://leetcode-cn.com/problems/unique-paths/solution/pythonbu-tong-lu-jing-by-jutraman/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    如何解决秒杀的性能问题和超卖的讨论
    Redis作者谈Redis应用场景
    Net开源工作流Roadflow的使用与集成
    VisualStudioOnline协同工作流程
    中文乱码?不,是 HTML 实体编码!(转)
    Nginx搭建反向代理服务器过程详解(转)
    2016年1月15日面试某互联网公司总结(转)
    浏览器缓存知识小结及应用(转)
    Gradle多项目配置的一个demo
    Android getResources的作用和须要注意点
  • 原文地址:https://www.cnblogs.com/topass123/p/12617324.html
Copyright © 2011-2022 走看看