【发布时间】:2021-03-21 08:48:13
【问题描述】:
网格旅行问题
她基本上是递归问题,就是这样:grid travel problem
这是我的解决方案:
#include <stdio.h>
#include <string.h>
int gridtravel(int r, int c) {
if (r == 1 && c == 1) return 1;
if (r == 0 || c == 0) return 0;
return gridtravel(r - 1, c) + gridtravel(r, c - 1);
}
int main() {
int r, c;
scanf("%i%i", &r, &c);
printf("%i\n", gridtravel(r, c));
}
但是当我想用这样的解决方案降低时间复杂度时,我得到了一个不正确的结果:
#include <stdio.h>
#include <string.h>
int gridtravel(int r, int c, int arr[][c]) {
if (arr[r][c] != 0) return arr[r][c];
if (arr[c][r] != 0) return arr[c][r];
if (r == 1 && c == 1) return 1;
if (r == 0 || c == 0) return 0;
arr[r][c] = gridtravel(r - 1, c, arr) + gridtravel(r, c - 1, arr);
return arr[r][c];
}
int main() {
int r, c;
scanf("%i%i", &r, &c);
int arr[r][c];
for (int i = 0; i <= r; ++i) {
for (int j = 0; j <= c; ++j) {
arr[i][j] = 0;
}
}
printf("%i\n", gridtravel(r, c, arr));
}
【问题讨论】:
-
是时候将其放入调试器并找出原因了。
-
定义数组时给出的“大小”是元素的数量,而不是顶部索引。所以
r元素数组的索引从0到r - 1,包括在内。这一切都意味着您超出了数组的范围,这会导致 未定义的行为。 -
请注意,您在每次递归调用时传递的 VLA 类型更改(
int arr[][c]与int arr[][c - 1]不同),但应该相同。跨度> -
arr[c][r]不能正确
标签: c recursion dynamic-programming