LeetCode 62 比动态规划更好的做法

本文详细解析了LeetCode第62题——Unique Paths,探讨了如何用动态规划解决问题,并提出了一种更简洁的数学解法。通过组合数学公式,将问题转化为计算排列方式,简化了算法实现。作者强调在刷题过程中,不仅要掌握基本算法,还要深入理解问题,追求最优解,以应对更具挑战性的面试或竞赛题。
摘要由CSDN通过智能技术生成

今天是LeetCode专题第36篇文章,我们一起来看下LeetCode的62题,Unique Paths。

题意

其实这是一道老掉牙的题目了,我在高中信息竞赛的选拔考试上就见过这题。可想而知它有多古老,或者说多经典吧。一般来说能够流传几十年的算法题,一定是经典中的经典。下面我们就来看下它的题意。

这题的题意很简单,给定一个矩形的迷宫,左上角有一个机器人,右下角是目的地。这个机器人只能向下走或者是向右走,请问这个机器人走到目的地的路径一共有多少种?

这题很良心地给定了条件,矩形的长和宽都不超过100.

样例

Input: m = 3, n = 2
Output: 3
Explanation:
From the top-left corner, there are a total of 3 ways to reach the bottom-right corner:
1. Right -> Right -> Down
2. Right -> Down -> Right
3. Down -> Right -> Right
Input: m = 7, n = 3
Output: 28

解法

在我写题解的时候,我突然想起来上一次见到它好像是在某个综艺节目当中。它被作为一道智力题来考一些明星嘉宾,好像一众明星里面,只有关晓彤做了出来。。。

它作为智力题有一个标准的模板式解法:

对于图中的C点来说,从起点通往它的路径数量等于通往A点和B点路径的和。

这个结论我们很多人都知道,因为C点只有两个来源,一个是A点一个是B点。它既可以从A点来,也可以从B点来,所以应该是一个加和的关系。

这当然是没错的,但不知道大家从这个过程当中有没有什么感悟。C点的上游是A点和B点,也就是说C状态是由A状态或者是B状态转移到的。这不就是一个动态规划算法吗?

我们用dp记录每一个位置的答案的话,那么可以很轻松地写出状态转移方程:

dp[i][j] = dp[i-1][j] + dp[i][j-1]

我们用代码把这个方程实现就能解出问题了。

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        dp = [[0 for _ in range(n+2)] for _ in range(m+2)]
        
        dp[0][1] = 1
        
        for i 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值