解题思路

题目给出了一个重要条件“机器人每次只能向下或者向右移动一步”由这个条件可以得出

  1. 当前的路径和与他的左边和上边的路径有关。[i - 1][j] 和 [i][j - 1]
  2. dp使用二维数组,dp[i][j]能到此处的所有路径和
  3. 得出推导公式为: dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
  4. 遍历顺序:顺序遍历
  5. 初始化:dp[0][0] = 1

代码

Python

1
2
3
4
5
6
7
8
9
10
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
box = [[0] * n for _ in range(m)]
box[0][0] = 1
for i in range(m):
for j in range(n):
if i == j == 0: continue
if 0 <= i - 1: box[i][j] += box[i - 1][j]
if 0 <= j - 1: box[i][j] += box[i][j - 1]
return box[m - 1][n - 1]

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> dp(m, vector<int>(n, 0));
dp[0][0] = 1;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (i - 1 >= 0) dp[i][j] += dp[i - 1][j];
if (j - 1 >= 0) dp[i][j] += dp[i][j - 1];
}
}
return dp[m - 1][n - 1];
}
};

Go

func uniquePaths(m int, n int) int {
    dp := make([][]int, m)
    for i := range dp {
        dp[i] = make([]int, n)
    }
    dp[0][0] = 1
    for i := 0; i < m; i++{
        for j := 0; j < n; j++ {
            if j == 0 && i == 0 {continue}
            if 0 <= i - 1 {dp[i][j] += dp[i - 1][j]}
            if 0 <= j - 1 {dp[i][j] += dp[i][j - 1]}
        }
    }
    return dp[m - 1][n - 1]
}