• 动态规划例题(一)


    一、leetcode地址

    leetcode地址:https://leetcode-cn.com/problems/unique-paths/

    二、题目:不同路径

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
    机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
    问总共有多少条不同的路径?

    三、解法

    1、数学公式法

    算法本就是数学的一部分,这种套用数学公式的解法可是非常爽的,最重要的是“简”。
    排列组合的公式
    (C_n^m)= ({A_n^m } over {m! })= ({n!} over {m!(n-m)!})
    在这里机器从左上角到右下角,向左和向右的步数都是固定的,所以可以表示为:
    (C_{m+n-2}^{m-1})
    用python代码来实现如下:

    class Solution:
        def uniquePaths(self, m: int, n: int) -> int:
            #使用排列组合公式
            return int(math.factorial(m+n-2)/math.factorial(m-1)/math.factorial(n-1))
    

    2、动态规划法

    动态规划方程:dp[i][j]=dp[i-1][j]+dp[i][j-1]
    第一行dp[0][j]和第一列dp[i][0]都是边界,定义为1
    用python代码实现如下:

    class Solution:
        def uniquePaths(self, m: int, n: int) -> int:
            #套用dp方程
            dp =[[1]*n]+[[1]+[0]*(n-1) for _ in range(m-1)]
            #print(dp)
            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]
    

    dp代码优化,只需要记录每一行的值即可,代码如下:

    class Solution:
        def uniquePaths(self, m: int, n: int) -> int:
            #dp优化方案
            dp=[1]*n
            for i in range(1,m):
                for j in range(1,n):
                    dp[j] += dp[j-1]
            return dp[-1]
    
  • 相关阅读:
    python基础-包
    python基础-模块
    python基础-面向过程与函数式
    python基础-二分法
    python基础-函数递归
    python基础-生成器
    QFNU-ACM 2020.11.6 Trating
    ACM 实验室2020.11.01天梯赛练习*4
    QFNU-ACM 2020.10.30 Trating
    QFNU-ACM 2020.10.23 Trating
  • 原文地址:https://www.cnblogs.com/lvsling/p/14418778.html
Copyright © 2020-2023  润新知