题目
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
分析
就是普通的深度搜索加备忘录求解即可。注意递归常常采用自顶向下,即从矩阵的右下角开始进行求解。像这种矩阵路径问题都属于尾递归问题,可以使用备忘录,即在返回结果前进行先使用备忘录存起来。
代码
class Solution {
public:
int m;
int n;
int dfs(vector<vector<int> >& dp, int x, int y){
if(x<0 || y<0 || x>m || y>n){
return 0;
}
if(x==0 && y==0) return 1;
if(dp[x][y]!=-1) return dp[x][y];
int ans = dfs(dp, x-1, y) + dfs(dp, x, y-1);
dp[x][y] = ans;
return dp[x][y];
}
int uniquePaths(int m1, int n1) {
m = m1;
n = n1;
//为防止超时,使用记忆化递归
vector<vector<int>> dp(m, vector<int>(n, -1));
dfs(dp, m-1, n-1);
//在原来的无障碍的基础上加上一层判断
return dp[m-1][n-1];
}
};