1. 题目来源
链接:62. 不同路径
2. 题目解析
经典的 dp
问题,也可归结到组合数问题。
- 时间复杂度: O ( n 2 ) O(n^2) O(n2)。
- 空间复杂度: O ( n 2 ) O(n^2) O(n2)
代码:
// 常规
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> f(n, vector<int>(m));
for (int i = 0; i < n; i ++ ) {
for (int j = 0; j < m; j ++ ) {
if (!i && !j) f[i][j] = 1;
else {
if (i) f[i][j] += f[i - 1][j];
if (j) f[i][j] += f[i][j - 1];
}
}
}
return f[n - 1][m - 1];
}
};
// 优化边界情况
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> f(n + 1, vector<int>(m + 1));
for (int i = 1; i <= n; i ++ ) {
for (int j = 1; j <= m; j ++ ) {
if (i == 1 && j == 1) f[i][j] = 1;
else f[i][j] = f[i - 1][j] + f[i][j - 1];
}
}
return f[n][m];
}
};
// 组合数
const int N = 205;
unsigned long long C[N][N];
class Solution {
public:
void init() {
for (int i = 0; i < N; ++i)
for (int j = 0; j <= i; ++j) {
if (!j) C[i][j] = 1;
else C[i][j] = C[i - 1][j] + C[i - 1][j - 1];
}
}
int uniquePaths(int m, int n) {
init();
return C[m + n - 2][n - 1];
}
};