【发布时间】:2021-08-13 03:55:25
【问题描述】:
我必须使用哈希表解决以下问题(在 C 中)(我假设使用哈希表,因为我们现在正在研究哈希表):
输入的第一行有2个数字:n、m
接下来,我们输入带有 m 个数字的 n 行。 (所以一个 n*m 矩阵) 我们必须从左上角走到右下角(只能向南或向东移动)。我们穿过的每个单元格要么将单元格中的数字添加到变量“s”中,要么减少它。因此,如果我们遍历一个带有 -5 的单元格,我们将得到 s-5 ,如果我们遍历一个带有 +3 的单元格,我们将得到 s+3。一开始,s是左上角的数字,总是>0。另一个规则是我们不能遍历数字为 0 的单元格。此外,每次离开单元格时都必须减 1,因此每次离开单元格时都会得到 s-1。 输出必须是到达右下角后可以得到的最大s。 这是输入/输出的示例:
保证至少有一条到右下角的路径最终会给出一个s至少等于1,所以如果最后是s 是否定的路径肯定是错误的。
我很难解决这个问题(尤其是使用哈希表),因此非常感谢任何帮助。另外,有没有其他更有效的解决方法?
【问题讨论】:
-
这看起来不像是一个需要哈希表的练习。看起来应该只是数组。
-
除非有很多
0条目可以从哈希表中省略,否则效率会更高。 -
如果您的评估是正确的,这听起来像是在试图让您将其实现为递归函数,将其结果存储在哈希表中。不过,在这个特定实例中,哈希表相对于二维数组没有任何好处。
-
@selbie 您可能错过了“每次我们离开牢房时都会有 s-1”部分。我猜路径是 10-1 -6-1 +2-1 -1-1 +1-1 +3-1 -1 = 2。
-
或者,因为到达终点需要 6 步,所以无论走哪条路,您都可以简单地从
10 - 6开始。然后答案是 4-6+2-1+1+3-1=2。在每次移动时减 1 的唯一原因是,如果存在部分和在有效路径上不能为负数的限制(例如,如果正数是获得食物,负数是失去食物,移动需要一个食物)。问题描述中没有说明部分和不能为负的限制,因此每次移动减一个的要求相当愚蠢。
标签: c data-structures hashtable