题意:走棋盘,从左上到右下一共有多少种方法。
思路:求组合数。
class Solution {
public:
int uniquePaths(int m, int n) {
int a = m - 1;
int b = n - 1;
return cc(min(a, b), b + a);
}
int cc(int u, int d) {
if(u == 0) return 1;
if(u == 1) return d;
int re = 1;
vector<bool> mark(u, true);
for(int i = d; i > d - u; i --) {
re *= i;
for(int j = 0; j < mark.size(); j++) {
if(re % (j + 1) == 0 && mark[j]) {
re /= j + 1;
mark[j] = false;
}
}
}
return re;
}
};
另一种思路是用递推。
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> t(m, vector<int> (n, 1));
for(int i = 1; i < m ; ++ i) {
for(int j = 1; j < n; j ++) {
t[i][j] = t[i - 1][j] + t[i][j - 1];
}
}
return t[m - 1][n - 1];
}
};