动态规划(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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢

转载自www.cnblogs.com/topass123/p/12617324.html