【问题标题】:Trying to Understand the Logic试图理解逻辑
【发布时间】:2017-05-16 09:21:36
【问题描述】:

让我们考虑一个数字三角形,其中第一行出现一个数字,第二行出现两个数字,第三行出现三个,等等。开发一个程序来计算出现的数字总和中的最大值在从顶部到底部的路径上,因此 在每条路径上,下一个数字位于下一行,更准确地说是直接在下方或下方,并且在右侧一个位置; 行数严格为正,但小于 100; 所有数字都是 0 到 99 之间的正整数。

输入 :: 第一行中的整数 n - 测试用例的数量(大约等于 1000)。然后是 n 个测试用例。每个测试用例都以行数开头,然后是其内容。

输出 :: 对于每个测试用例,将确定的值写在单独的行中。

示例

Input:
2
3
1
2 1
1 2 3
4 
1 
1 2 
4 1 2
2 3 1 1 

Output:
5
9

我的问题是输出 5 和 9 是如何给出的?

【问题讨论】:

  • 这和C语言有什么关系?
  • 没有看到代码,我不知道谁能帮助你。
  • 好吧,好吧,在我看来,这不是写我的代码请求。 OP 正在寻求帮助以了解要求。请在投简历前再阅读一遍。
  • @SouravGhosh 已修复,您可以删除您的评论。
  • @ChrisTurner OP 要求了解要求,作为输入和预期 O/P 的形式。不需要代码。它不是针对任何代码段,而是需求理解,需要根据需求来编写代码。

标签: algorithm logic


【解决方案1】:

第一个输出是 5。让我们看看,你有下面的三角形(因为第一行是输入中三角形的数量,2,第二行是下一个金字塔的 height , 3):

1
2 1
1 2 3

您从第一行开始,总是直下或右下加一个,途中将数字相加。

这里有很多解决方案:

  • 总是向下:1+2+1 = 4
  • 永远正确:1+1+3 = 5
  • 向下,然后向右:1+2+2=5
  • ...

所以你能做的最好是 5。

同样的逻辑也适用于第二个三角形:

1 
1 2 
4 1 2
2 3 1 1 

最好是1+1+4+3=9,即down,down,right

【讨论】:

  • 您好,感谢您的回答。因此,当我将编写代码时,我必须检查所有可能性,对吗?在我必须选择的可能性中,哪一个是最高的,不是吗..??
  • 差不多就是这样,是的。或者找到一种方法来修剪一些路径以避免蛮力。
  • “找到一种方法来修剪一些路径以避免蛮力”我想尝试两者中的最高数量,但在第二种情况下不起作用。你能推荐其他方法吗?
  • @DibakarBose 有一种方法我们不必检查所有可能性。
【解决方案2】:

正如其中一个答案所述,我们必须检查所有可能性,但在这种方法中,它不是必需的。
它的工作原理是 -

  • 从倒数第二行开始,并针对该行中的每个元素 检查该元素可以产生的最大总和并替换 元素的最大值。

  • 对上面的行重复该过程,最后我们得到 通过考虑最顶层可以达到的最大值 元素。 上述方法是动态规划方法。
    该解决方案的复杂度为 O(元素数量),但如果我们检查所有可能性,那么它将给出指数解决方案。
    可以通过以下方式解决 -

考虑输入

    1
    2 1
    1 2 3

考虑倒数第二行 -
现在考虑这样一种情况,如果我们的路径以某种方式包含该行的 1st 元素,那么考虑到该元素可以实现的最大值是 - max(2+1,2+2) = 4 并且如果我们的路径以某种方式具有 2nd 这一行的元素,那么考虑到该元素,我们可以达到的最大值是max(1+2,1+3) = 4
现在我修改三角形如图 -

1
4 4


现在考虑上一行(只有一个元素)正上方的行
为此,如果在我们的路径中采用 1 可以达到的最大总和是 - max(1+4,1+4) = 5 因此,答案是 5。

对于第二种情况-

1 
1 2 
4 1 2
2 3 1 1

考虑倒数第二行后,三角形将看起来像 -

1 
1 2 
7 4 3

4 - 替换为 max(4+2,4+3)
1 - 替换为 max(1+3,1+1)
2 - 替换为 max(2+1,2+1)

现在对于它上面的行 -

1 
8 6 

最后——

9

所以答案是 9。

这是与上述问题相同的问题的链接 - https://www.hackerrank.com/contests/projecteuler/challenges/euler018

【讨论】:

  • 嗨..感谢您的回复...您提到的解决方案很棒。但这是递归方法吗?如果我们考虑时间复杂度,它是否比蛮力技术更好?
  • @DibakarBose 上述方法不是递归的,是的,它比蛮力更好,因为我们没有尝试所有的可能性。如您所见,在每次迭代中,我们只访问该行中的元素。所以总复杂度是O(矩阵/三角形中的元素数)。我也实现了上述解决方案的代码并被接受。
  • 哦..太好了..我会尝试做代码..让我们看看会发生什么。 :) 非常感谢您的帮助.. :)
  • @DibakarBose 您是否尝试编写 Derin 回答中提到的方法?
  • 还有一件事.. 我认为这不是问这个问题的最佳地点,但我仍然想知道.. 对于良好的编码,我想数学知识是必要的。那么你能建议我应该学习哪些主题或者哪些主题可以帮助我更多...
猜你喜欢
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 2022-12-07
  • 2022-07-06
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多