如何在以下条件下获得数组的最大和?

时间:2018-11-05 08:39:31

标签: math logic dynamic-programming puzzle

假定存在的问题如下:

  

在火星上生活着一群蠕虫。每个蠕虫都表示为一维数组中的元素。蠕虫决定互相吃东西,但任何蠕虫只能吃最近的邻居。每个蠕虫都有一个预设的能量(即即元素的值)。在火星上,法律规定,当能量为 x 的蠕虫 i 吃另一种能量为 y 的蠕虫时, i 个蠕虫的最终能量变为 xy 。蠕虫被允许具有负能量水平。

     

找到最后一个蠕虫的能量最大值。

Sample data:
0,-1,-1,-1,-1 has answer 4.
2,1,2,1 has answer 4.

解决此问题的合适逻辑是什么?

1 个答案:

答案 0 :(得分:3)

此问题具有非常简单的 O(N)解决方案。

如果数组中的两个成员具有不同的符号,则答案是所有元素的绝对值之和。

要了解原因,请想象一下数组中的单个正值,所有其他元素均为负(示例1)。现在最好的策略是使该值保持正值,并逐渐吞噬所有邻居,以增加该值。正值的位置无关紧要。对于单个否定元素,该策略相同。

在更一般的情况下,如果大小为N的数组具有不同符号的值,我们总是可以找到大小为N-1的具有不同符号的数组,因为必须有一对具有不同的符号,我们可以将它们组合成我们喜欢的任何符号。

例如使用以下数组:[1,2,-5,4,-10]

  1. 我们可以组合(2,-5)或(4,-10)。让我们结合(4,-10)得到[1,2,-5,-14]
  2. 我们现在只能服用(2,-5)。所以我们的数组现在是:[1,-7,-14]
  3. 只能再次(1,-7)。但是这一次我们必须保持合并价值为正。因此,我们剩下了:[8,-14]
  4. 最终组合为我们提供22,即所有绝对值的总和。

对于所有具有相同符号的值,我们的第一步是产生一个相反的符号,该符号将具有最小“成本”的邻居对组合在一起。直观上,我们不想在此转换上浪费两个大数字。如果我们采用x,y个邻居对,则组合后(相反符号)的新值将为abs(x-y)。由于结果只是绝对值的总和,因此我们可以将其解释为-从最大可能的输出中“丢失” abs(x)abs(y),而改为“获得” abs(x-y)。因此,使用此对进行符号转换的“成本”为abs(x)+abs(y)-abs(x-y)。由于我们需要最小化此成本,因此我们选择具有最低此类值的初始阵列邻居对。

因此,如果我们采用上述数组,但现在所有值均为正[1,2,5,4,10]

  1. (1,2)转换为-1的“费用”为1+2-abs(-1)=2
  2. (2,5)转换为-3的“费用”为2+5-abs(-3)=4
  3. (5,4)转换为-1的“费用”为5+4-abs(-1)=8
  4. (4,10)转换为-6的“费用”为4+10-abs(-6)=8

因此,我们将(1,2)对转换为-1。然后,将所得数组的绝对值求和即可得到20。请注意,该值比我们前面的示例小2。