当前位置: 首页 > 知识库问答 >
问题:

在网格上查找唯一路径的数量

柴宝
2023-03-14

我正在尝试了解如何使用动态编程解决在网格中查找所有唯一路径的问题:

机器人位于m x n网格的左上角(下图中标记为“开始”)。机器人只能在任何时间点向下或向右移动。机器人正试图到达网格的右下角(下图中标记为“Finish”)。有多少种可能的独特路径?

我正在看这篇文章,我想知道为什么在下面的解决方案中,矩阵被初始化为M_MAX 2N_MAX 2,以及为什么在backtrack的函数签名中,最后一个参数被初始化为int mat[[N_MAX 2]

const int M_MAX = 100;
const int N_MAX = 100;

int backtrack(int r, int c, int m, int n, int mat[][N_MAX+2]) {
  if (r == m && c == n)
    return 1;
  if (r > m || c > n)
    return 0;

  if (mat[r+1][c] == -1)
    mat[r+1][c] = backtrack(r+1, c, m, n, mat);
  if (mat[r][c+1] == -1)
    mat[r][c+1] = backtrack(r, c+1, m, n, mat);

  return mat[r+1][c] + mat[r][c+1];
}

int bt(int m, int n) {
  int mat[M_MAX+2][N_MAX+2];
  for (int i = 0; i < M_MAX+2; i++) {
    for (int j = 0; j < N_MAX+2; j++) {
      mat[i][j] = -1;
    }
  }
  return backtrack(1, 1, m, n, mat);
}

然后在作者自下而上的解决方案中:

const int M_MAX = 100;
const int N_MAX = 100;

int dp(int m, int n) {
  int mat[M_MAX+2][N_MAX+2] = {0};
  mat[m][n+1] = 1;

  for (int r = m; r >= 1; r--)
    for (int c = n; c >= 1; c--)
      mat[r][c] = mat[r+1][c] + mat[r][c+1];

  return mat[1][1];
}

我不知道这行的目的是什么mat[m][n1]=1 发球。

我不熟悉Java,所以如果这些问题归结为语法或语言特定的问题,我深表歉意。


共有1个答案

弘承运
2023-03-14

首先,请注意,作者和第二个解决方案都使用基于1的索引。因此,当然,mat[M_MAX1][N_MAX1]是非常合理的。

现在,请注意作者使用的逻辑。

mat[r][c] = mat[r+1][c] + mat[r][c+1];

因此,为了防止r1c1c=n1r=m1时越界,而不是添加这样的if语句:

if (r == m)
    mat[r][c] = mat[r][c+1];
if (c == n)
    mat[r][c] = mat[r+1][c];

他决定简单地添加一个额外的行或列,其中存储0值。因此:

mat[M_MAX+2][N_MAX+2] = {0};

最后,在自下而上的方法中,必须将mat[m][n]初始化为1。与其这样做,不如知道mat[m][n]=mat[m1][n]mat[m][n1] ,他初始化:

mat[m][n+1] = 1; // mat[m+1][n] = 0;

欢迎在评论中提出任何问题。

 类似资料:
  • 我的想法: 回溯解决方案,我们通过所有解决方案的树和打印,一旦我们达到目标单元格。我实现了这一点,但我不确定它是否正确或有意义,或者它是否是正确的方法。我在这里发布了代码,如果有人能解释它的错误,我将非常感谢。 递归解决方案,我从起始单元格开始,并从每个相邻单元格递归地找到目标单元格的路径,基本情况是击中目标单元格。 5)有没有更简单的方法来做到这一点? 下面是我的代码,它打印N=4的正确路径数。

  • 我正在学习bfs/dfs,并试图解决这个问题。有一个n×n的网格。找到在网格中从源单元格移动到目标单元格所需的路径(不一定是最短路径),并返回这些单元格之间的路径。每个网格单元格都有一个值。我们可以一次向四个方向移动一步:上、下、左、右。我们只能移动到具有相等或较小值的相邻单元格。如果没有移动可能到达目标,则返回无。目标在右下角,起点在左上角 下面是我的解决方案,但似乎结果与输出结果混合在一起。任

  • 给定二维正整数数组。“路径”是相邻单元格的集合。两个单元格仅从右/左/上/下(无对角线)相邻。 任务是编写一个函数,用于接收2D数组、整数和2D数组路径(与mat大小相同-空数组均为零)。 函数应检查单元格总和等于sum的路径是否存在,如果存在,则应返回true,否则返回false。 数组路径将标记路径(如果存在路径,则标记路径为1)。 例如,如果mat是: 和总和=4 然后,路径可以是以下三种路

  • 我遇到的问题是: 机器人位于m x n网格的左上角。机器人只能在任何时间点向下或向右移动。机器人正试图到达网格的右下角。有多少种可能的独特路径? 我提交的代码是: 提交后,我知道我的代码只比其他提交的代码快21%。这意味着我的代码不是最优的。出于好奇,我检查了另一份提交的文件,它比我的要快得多。 更好的解决方案是: 如你所见,它的时间复杂度是线性的,而我的是二次的。但我无法理解背后的逻辑。

  • 我在JavaFX中创建了一个迷宫游戏,用户可以创建自己的迷宫并玩它。迷宫是使用带有CSS IDs的按钮构建的,CSS IDs取决于关卡临时存储的二维数组。 问题出现在项目的下一部分。我创建了一个生成随机迷宫的算法。为了使水平成为可能,我需要检查迷宫是否可解(即,你可以从起点(0,3)到终点(6,3))。 我使用相同的显示算法创建了一个单独的项目,类如下: 主要.java Runner.java M

  • 我有一个无向图,我想从一个起始节点列出所有可能的路径。2个节点之间的每个连接在列出的路径中是唯一的,例如,给出以下图表示: 我无法使用现有的算法来完成它,我知道像DFS。任何帮助都将非常感谢。