这里是本包(包子)自己总结的几种方法,大家一起交流学习,首先我想到什么了呢,就是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]