注:
backtrack法会超时
题目:
题解:
class Solution {
public:
int count=0;
int row;
int col;
void backtracking(int m,int n){
if(mrow&&ncol){
count++;
return;
}
else if(mrow+1||ncol+1){
return;
}
backtracking(m+1,n);
backtracking(m,n+1);
}
int uniquePaths(int m, int n) {
row=m;
col=n;
backtracking(1,1);
return count;
}
};
官方题解:
我们用 f(i, j)表示从左上角走到 (i, j) 的路径数量,其中i和j的范围分别是 [0, m) 和 [0, n)。
由于我们每一步只能从向下或者向右移动一步,因此要想走到 (i,j),如果向下走一步,那么会从 (i-1, j) 走过来;如果向右走一步,那么会从 (i, j-1)走过来。因此我们可以写出动态规划转移方程:
f(i, j) = f(i-1, j) + f(i, j-1)
需要注意的是,如果 i=0i=0,那么f(i−1,j) 并不是一个满足要求的状态,我们需要忽略这一项;同理,如果 j=0,那么 f(i,j−1) 并不是一个满足要求的状态,我们需要忽略这一项。
初始条件为 f(0,0)=1,即从左上角走到左上角有一种方法。
最终的答案即为 f(m-1,n-1)。
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> ans(m, vector<int>(n));
for(int i=0;i<m;i++){
ans[i][0]=1;
}
for(int j=0;j<n;j++){
ans[0][j]=1;
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
ans[i][j]=ans[i-1][j]+ans[i][j-1];
}
}
return ans[m-1][n-1];
}
};