解法一:自顶向下的递归dp + 备忘录
func uniquePaths(m int, n int) int {
// 备忘录
memo := make([][]int, m)
for i := range memo {
memo[i] = make([]int, n)
}
return dp(m-1, n-1, memo)
}
// 定义:从 (0, 0) 到 (x, y) 有 dp(x, y) 条路径
func dp(x int, y int, memo [][]int) int {
// base case
if x == 0 && y == 0 {
return 1
}
if x < 0 || y < 0 {
return 0
}
// 避免冗余计算
if memo[x][y] > 0 {
return memo[x][y]
}
// 状态转移方程:
// 到达 (x, y) 的路径数等于到达 (x - 1, y) 和 (x, y - 1) 路径数之和
memo[x][y] = dp(x-1, y, memo) + dp(x, y-1, memo)
return memo[x][y]
}
- 时间复杂度:O(m*n)
- 空间复杂度:O(m*n)