描述
一个机器人在m×n大小的地图的左上角(起点)。机器人每次可以向下或向右移动。机器人要到达地图的右下角(终点)。可以有多少种不同的路径从起点走到终点?
备注:m和n小于等于100,并保证计算结果在int范围内
数据范围:,保证计算结果在32位整型范围内要求:空间复杂度 ,时间复杂度 进阶:空间复杂度 ,时间复杂度
递归
终止条件:当矩阵变长n减少到1的时候,只能往下走,没有别的选择,只有一条路径,同理m减少到1的时候也只有一条路径,所以返回数量为1.
返回值:每一级将其子问题返回的结果相加给上一级
本级任务:每一级有向下或向右的选择,分别进入相应分支的子问题
public int uniquePaths (int m, int n) {
if(m == 1 || n == 1)
return 1;
return uniquePaths(m-1,n)+uniquePaths(m,n-1);
}
路径规划
- 用dp[i][j] 表示大小为i * j 的矩阵的路径数量,下标从1 开始
- 初始条件:当i或j为1 的时候,代表矩阵只有一行或者一列,只有一种路径
- 转移方程:每个格子的路径数只会来自它左边的格子数和上边的格子数,所以转变为如下dp[i][j] = dp[i-1][j-1];
public int uniquePaths (int m, int n) {
int[][] dp = new int[m+1][n+1];
for(int i =1;i <= m; i++){
for(int j =1; j<=n;j++){
if(i==1 || j==1){
dp[i][j] = 1;
continue;
}
dp[i][j] = dp[i-1][j-1];
}
}
return dp[m][n];
}