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)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    安卓查询当前所在地天气及查询地区(城市)代码cityCode localCode
    文件读写IO
    【桌面虚拟化】之三 Persistent vs NonP
    Android软件开发之常用系统控件界面整理
    Spring 3.x企业应用开发实战(11)----基于@AspectJ配置切面
    Java之Static静态修饰符详解
    OWASP
    2001中美黑客大战
    能"干掉"苹果的中国"黑客"
    Roy Li的学习和成长自传
  • 原文地址:https://www.cnblogs.com/topass123/p/12617324.html
Copyright © 2011-2022 走看看