0
点赞
收藏
分享

微信扫一扫

每天一道算法题(31)

描述

一个机器人在m×n大小的地图的左上角(起点)。机器人每次可以向下或向右移动。机器人要到达地图的右下角(终点)。可以有多少种不同的路径从起点走到终点?每天一道算法题(31)_数据

备注:m和n小于等于100,并保证计算结果在int范围内

数据范围:每天一道算法题(31)_数据_02,保证计算结果在32位整型范围内要求:空间复杂度 每天一道算法题(31)_空间复杂度_03,时间复杂度 每天一道算法题(31)_空间复杂度_03进阶:空间复杂度 每天一道算法题(31)_数据_05,时间复杂度 每天一道算法题(31)_空间复杂度_06

递归

终止条件:当矩阵变长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);
}


路径规划

  1. 用dp[i][j] 表示大小为i * j 的矩阵的路径数量,下标从1 开始
  2. 初始条件:当i或j为1 的时候,代表矩阵只有一行或者一列,只有一种路径
  3. 转移方程:每个格子的路径数只会来自它左边的格子数和上边的格子数,所以转变为如下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];
}


举报

相关推荐

0 条评论