金字塔算法

时间:2014-02-03 03:06:36

标签: algorithm math

我正在尝试找到一种算法,在这种算法中,我可以通过数字金字塔,从金字塔的顶部开始,然后前进到下一行中的相邻数字,每个数字都必须添加到最终总和中。问题是,我必须找到返回最高结果的路线。

我已经尝试在下一行中查看较高的相邻号码,但这不是答案,因为它并不总能获得最佳路线。

        34
      43  42
    67  89  68
  05  51  32  78
72  25  32  49  40

如果我查看最高的相邻号码,则为:

34 + 43 + 89 + 51 + 32 = 249

但如果我走了:

34 + 42 + 68 + 78 + 49 = 269

在第二种情况下,结果更高,但是我手动制作了这条路线,我无法想到在所有情况下获得最高结果的算法。

任何人都可以帮我一把吗?

(如果我没有表达自己,请告诉我)

2 个答案:

答案 0 :(得分:5)

从底行开始。当您从左到右时,请考虑两个相邻的数字。现在上一行并比较上面一行中两个数字之上的数字之和与下面的每个数字。选择较大的总和。

基本上,您正在查看由底行和上面的行形成的三角形。所以对于你原来的三角形,

        34
      43  42
    67  89  68
  05  51  32  78
72  25  32  49  40

左下角的三角形看起来像,

  05
72  25

所以你要添加72 + 05 = 77,因为这是72 + 0525 + 05之间的最大总和。

类似地,

  51
25  32

会给你51 + 32 = 83

如果对每两个相邻的数字和上面的数字继续这种方法,你可以丢弃底行并用计算的总和替换上面的行。

所以在这种情况下,倒数第二行变为

77  83  81  127

你的新金字塔是

      34
    43  42
  67  89  68
77  83  81  127

继续这样做,你的金字塔开始缩小,直到你有一个数字,这就是你所追求的数字。

    34
  43  42
150 172 195

   34
215  237

最后,您只剩下一个号码271

答案 1 :(得分:2)

从底部开始(逐行),将每个元素下的两个值的最高值添加到该元素。

因此,对于您的树,例如05将替换为max(72, 25) + 05 = 77。稍后,您会将51元素的最大值和新值添加到67

最顶层节点将是最大总和。

不要破坏你所有的乐趣,如果需要的话,我会把实现留给你,或者获取实际路径的细节。