题目描述
解决方案
一开始看到这道题想到的是高中的时候学的排列组合问题,但是用排列组合的方法来解决太过于复杂了,不仅时间复杂度比较高,而且过程中空间占用比较大,很可能会溢出。经过分析发现这是一个基本的DP问题。
由于机器人只能左右移动,当它到达一个点时,只有两种可能:
- 下移
- 右移
因此,我们得到以下状态方程:假设到达点(i, j)的路径数记为P[i][j],则
P[i][j] = P[i - 1][j] + P[i][j - 1]
上述方程的边界条件出现在最左边的列(P[i][j - 1]不存在)和最上面的行(P[i - 1][j]不存在)。这些条件可以通过初始化(预处理)来处理——对于所有有效的i, j,初始化P[0][j] = 1, P[i][0] = 1。
代码
class Solution {
int uniquePaths(int m, int n) {
if (m > n) return uniquePaths(n, m);
vector<int> pre(m, 1);
vector<int> cur(m, 1);
for (int j = 1; j < n; j++) {
for (int i = 1; i < m; i++)
cur[i] = cur[i - 1] + pre[i];
swap(pre, cur);
}
return pre[m - 1];
}
};
class Solution {
int uniquePaths(int m, int n) {
if (m > n) return uniquePaths(n, m);
vector<int> cur(m, 1);
for (int j = 1; j < n; j++)
for (int i = 1; i < m; i++)
cur[i] += cur[i - 1];
return cur[m - 1];
}
};