Problem
1. 题目简述
一个机器人坐落在一个m x n的一个网格中,初始点在top-left,终点在bottom-right,机器人只能向右或者向下走,求问有多少种走法可以到达终点。
2. 算法思路
参考解法:花花酱LeetCode
也是一道经典老题目了,DP的代表问题之一。LeetCode 63. Unique Paths II
动态规划
我们定义dp[i][j]为从[0][0]到达当前点的所有可能的方式,由于只能向右或者向下走,所以有如下递推式:
$$dp[i][j] = dp[i - 1][j] + dp[i][j - 1]$$
base case就是dp[0]和dp[i][0],这两条边线的初始值都为1,只有一种走法。
时间复杂度:O(m * n)空间复杂度:O(m * n)
class Solution {
// top-down
public int uniquePaths(int m, int n) {
int[][] dp = new int[m][n];
for (int i = 0; i < m; i++) {
Arrays.fill(dp[i], -1);
dp[i][0] = 1;
}
Arrays.fill(dp[0], 1);
return helper(dp, m - 1, n - 1);
}
private int helper(int[][] dp, int m, int n) {
if (m < 0 || n < 0) {
return 0;
}
if (dp[m][n] != -1) {
return dp[m][n];
}
dp[m][n] = helper(dp, m, n - 1) + helper(dp, m - 1, n);
return dp[m][n];
}
}
class Solution {
// bottom-up
public int uniquePaths(int m, int n) {
int[][] dp = new int[m][n];
for (int i = 0; i < m; i++) {
Arrays.fill(dp[i], -1);
dp[i][0] = 1;
}
Arrays.fill(dp[0], 1);
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[m - 1][n - 1];
}
}