本题的主要思路就是动态规划问题。首先找动态规划的递归表达式,假如咱们站在终点看,那机器人来的方向有两个,左边方向和上边方向,也就是到达此位置的路径数目就是这两个方向的数目之和。借助矩阵很容易写出递归表达式,num[i][j]=num[i-1][j]+num[i][j-1]。需要注意的点是当位置在矩阵的最上边的行和最左侧的行时,路径数为1,因为机器人只能往右边和下边走,不能往上或者往左边拐。
代码如下:
class Solution {
public:
int uniquePaths(int m, int n) {//动态规划
if(m<1||n<1){
return 0;
}
int num[m][n];
for(int r=0;r<m;r++)
{//计算顶行的路径数
num[r][0]=1;
}
for(int c=1;c<n;c++)
{//计算左侧列的路径数
num[0][c]=1;
}
for(int i=1;i<m;i++)
{//逐行进行计算
for(int j=1;j<n;j++)
{//在某一行中,从左边和上边的方向到达位置
num[i][j]=num[i-1][j]+num[i][j-1];
}
}
return num[m-1][n-1];
}
};
当然了,代码还有优化的地方,那就是用一维数组代替二维数组可以节约空间。递归表达式是num[i]+=num[j-1],逐行计算。需要注意的点是在递归方程计算之前num[i]记录的是来自上一行方向的路径数,num[i-1]是来自左边的路径数。代码如下:
class Solution {
public:
int uniquePaths(int m, int n) {//动态规划
if(m<1||n<1){
return 0;
}
vector<int> num(n,1);
for(int i=1;i<m;i++)
{//逐行进行计算
for(int j=1;j<n;j++)
{//在某一行中,从左边和上边的方向到达位置
num[j]+=num[j-1]; // from num[i][j]=num[i-1][j]+num[i][j-1];
}
}
return num[n-1];
}
};