2021-2-25 62. 不同路径(动态规划)

注:
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];
    }
};
上一篇:LeetCode 77. 组合


下一篇:【回溯法DFS】78. 子集1、90. 子集 II