马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
题目描述:
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
代码在下面:class Solution(object):
def uniquePaths(self, m, n):
"""
:type m: int
:type n: int
:rtype: int
"""
# 采用二位数组形式的动态规划
# f[i][j]表示当前移动到的总次数,要求f[-1][-1]
# 状态转移公式:f[i][j] = f[i-1][j]+f[i][j-1]
# 初始值:每一步移动的次数可以看做横轴和纵轴的和,因此 f[i][0] = 1,f[0][j]=1
# 运动的轨迹:要么往下,要么往左
# 时间复杂度:O(m*n),空间复杂度:O(m*n)
f = [[0]*n for zong in range(m)]
for i in range(m):
f[i][0] = 1
for j in range(n):
f[0][j] = 1
for i in range(1,m):
for j in range(1,n):
f[i][j] = f[i-1][j]+f[i][j-1]
return f[-1][-1]
"""优化空间复杂度为O(n)"""
# 对二维矩阵进行压缩成一位数组,将最新生成的值覆盖掉旧的值,逐行求解当前位置的最新路径条数!
# 实质:在于动态计算并替换当前位置下的路径数最新值
# 状态转移公式变成:f[i] = f[i-1]+f[i]
# 初始值: f = [1]*m,取横轴
# f[-1]表示可能路径的总数
# 空间复杂度:O(n),时间复杂度:O(m*n)
f = [1]*m
for j in range(1,n):
for i in range(1,m):
f[i] = f[i-1]+f[i]
return f[-1]
不明白的是为什么dp[-1][-1]能表示到最右下角的格子的最多路径?上段代码中如何体现最多路径数 |