题目
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
易错提示
"""
此方法来建立二维数组是错误的,*n操作只是创建n个指向list的引用,
所以一旦list改变,dp中n个list也会随之改变
"""
dp = [[0]*n]*m
dp[m-1][n-1] = 10
Python实现
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
if m==1 or n==1:return 1
dp = [[0 for i in range(n)] for j in range(m)]
dp[m-1][n-1] = 0
dp[m-2][n-1] = 1
dp[m-1][n-2] = 1
for n_ in range(1,n+1):
for m_ in range(1,m+1):
if m_ == n_ ==1:continue
if dp[m-m_][n-n_] == 0:
if m-m_+1 >= m :
m_v = 0
else:
m_v = dp[m-m_+1][n-n_]
if n-n_+1 >= n :
n_v = 0
else:
n_v = dp[m-m_][n-n_+1]
dp[m-m_][n-n_] = m_v + n_v
return dp[0][0]
Golang实现
func uniquePaths(m int, n int) int {
if m ==1||n==1 {
return 1
}
//初始化DP数组
dp :=make([][]int,m)
for i:=0;i<m;i++{
dp[i]=make([]int,n)
}
var m_v int = 0
var n_v int = 0
dp[m-1][n-1] = 0
dp[m-2][n-1] = 1
dp[m-1][n-2] = 1
for i:=1;i<=m;i++{
for j:=1;j<=n;j++{
if i==1 && j==1{
continue
}
if dp[m-i][n-j] ==0{
if m-i+1>=m{
m_v = 0
} else{
m_v = dp[m-i+1][n-j]
}
if n-j+1 >= n{
n_v = 0
} else{
n_v = dp[m-i][n-j+1]
}
dp[m-i][n-j] = m_v + n_v
}
}
}
return dp[0][0]
}