如何实现从(0,0)到(a,b)的路径实现,用python

  这里是本包(包子)自己总结的几种方法,大家一起交流学习,首先我想到什么了呢,就是for的暴力循环,家人们,这整个就是一个大超时,有可能,所以本包想到了另一种小low的办法,如下:

说明:m 和 n 的值均不超过 100。

示例 1:

输入: m = 3, n = 2

输出: 3

解释:

从左上角开始,总共有 3 条路径可以到达右下角。

1. 向右 -> 向右 -> 向下

2. 向右 -> 向下 -> 向右

3. 向下 -> 向右 -> 向右

示例 2:

输入: m = 7, n = 3

输出: 28

解决方案

拿到该题,第一步想到的是利用for循环暴力法来决解,可能会超时,所以考虑到动态规划。

思路如下:

将路径的数目设为:s[a][b],(a,b则分别代表表格中的坐标)因为题目规定只能向下或者向右移动,所以可以得到一个关系式:

s[a][b]=s[a-1][b]+s[a][b-1]

该关系式表示:要到达坐标(a,b)则是由到到(a-1,b)与(a,b-1)的所有路径之和:

 即要到达s[a][b]点必先到达S[a][b-1]或者S[a-1][b],所以说到达s[a][b]的路径数目就是S[a][b-1]与S[a-1][b]路径之和;同时因为第一行与第一列的路径仅由该行或该列的路径所达到,所以只有一条路径。

s = [[1]*n] + [[1]+[0] * (n-1) for  _ in range(m-1)]

#将m,n构成的表转化为二维数组。

for x in range(1, m):   

        for y in range(1, n):

#遍历表中的各个元素。      

  s[x][y] = s[x-1][y] + s[x][y-1]

#满足的关系式

print(s[-1][-1])

#输出


       2023.5.17,这是一条分割线,今天离六级刷分只有一个月的时间了,朋友们,我想到了了一种新的解决该问题的办法。现在与大家分享一下。

动态规划的思想。dp为一个m*n的矩阵,对于 i =1:m, j = 1: n, dp[i][j]表示机器人从开始位置走到当前位置的路径总数,因为机器人每次只能向下和向右移动,所以 dp[i][j] 的值和 dp[i-1[j] 和 dp[i][j-1] 有关系,我们就得到了转移条件。而我们知道边界条件dp的第一行和第一列的路径只有一条。比如对于一个3行5列的网格,机器人从左上角到右下角的路径数,用动态矩阵dp可以表示如下:
 

class Solution:
    def uniquePaths(self, m, n):
        """
        :type m: int
        :type n: int
        :rtype: int
        """
        dp=[]
        [dp.append([0]*n) for i in range(m)]
        for i in range(m):
            for j in range(n):
                if i-1<0 or j-1<0:
                    dp[i][j]=1
                else:
                    dp[i][j]=dp[i-1][j]+dp[i][j-1]
        return dp[i][j]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值