[英]Finding the number of unique paths on a gird
我正在尝试了解如何解决使用动态编程在网格中查找所有唯一路径的问题:
机器人位于amxn网格的左上角(在下图中标记为“开始”)。 机器人只能在任何时间点上下移动。 机器人试图到达网格的右下角(在下图中标记为“完成”)。 有多少种可能的独特路径?
我一直在寻找在这篇文章中 ,我想知道为什么在下面的解决方案,矩阵在初始化M_MAX + 2
和N_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][n+1] = 1;
的目的是什么mat[m][n+1] = 1;
供应。
我对Java不熟悉,因此对于这些问题归结为语法或特定于语言的问题,我深表歉意。
首先,请注意作者和第二个解决方案都使用基于1的索引。 因此,当然, mat[M_MAX+1][N_MAX+1]
是完全合理的。
现在,注意作者使用的逻辑。
mat[r][c] = mat[r+1][c] + mat[r][c+1];
因此,为防止当c = n+1
或r = m+1
时r+1
或c+1
超出范围,而不是添加如下的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[m+1][n] + mat[m][n+1];
,他初始化为:
mat[m][n+1] = 1; // mat[m+1][n] = 0;
随时在评论中提问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.