zoukankan      html  css  js  c++  java
  • 动态规划例题(一)

    一、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]
    
  • 相关阅读:
    3年A班,从现在起大家都是人质-观后感
    深入浅出的Object.defineProperty()
    在Vue中使用插槽(solt)
    非父子组件间的传值
    给组件绑定原生事件
    组件参数校验与非props特性
    Vue父子组件的数据传递
    Vue组件使用中的细节点
    vue中set基本用法
    vue中的列表渲染
  • 原文地址:https://www.cnblogs.com/lvsling/p/14418778.html
Copyright © 2011-2022 走看看