圆中的最大次连续和

  • 本文关键字:连续 arrays algorithm
  • 更新时间 :
  • 英文 :


问题是我有一个用n个数字填充的数组。我必须确定最大和,但是,如果位置I的数字加在和上,那么数字I-1和I+1就不能加。

n数被认为是循环中的。

例如,如果有下一个数组:

{6,9,1,2,8,6,3,7,12,5,65,66,2}最大总和为99:9+8+3+12+65+2=99

假设您知道数组的第一个元素包含在内。然后你可以通过动态编程来解决这个问题:对于i=3到N-1,通过考虑是否包括元素i的选择,并查看之前为第一个i-1或i-2元素的最佳解决方案计算的分数,为数组的前i个成员计算出最佳解决方案,以计算出你能为i个元素做的最好的事情。你不需要计算出N个元素的最佳值,因为你不能包括最后一个元素,因为你包括了第一个元素,前两个元素的分数与第一个元素的得分相同,因为你包含了它。

另一种可能性是不包括第一个元素。但是你可以用同样的方法计算出最好的分数,除了考虑i=2到N的可能性。

现在您已经找到了两种可能情况的答案——第一个元素被包含或不包含——所以选择最好的。

附言——如果这不是家庭作业,那么这真的有有用的应用吗?它是什么?

我觉得你的问题很有趣,但不想回应,因为你没有表现出自己的任何努力。

不管怎样,既然麦克道尔已经回答了这个问题,我将试着详细阐述他的回答。

让我们取输入数组:

a = [6, 9, 1, 2, 8, 6, 3, 7, 12, 5, 65, 66, 2]

这个想法是逐步通过这个数组来计算两个最好的解决方案。在步骤i,这两个解是包括a[i]最佳解和不包括a[i]。下面是这个算法的一个例子,上面的数组作为输入:

// step = 1
solutions = [6], []

这个步骤(步骤-1)是显而易见的,我们只有数组中的第一个元素。注意,第一溶液成分([6])对应于包括a[1]的成分,并且第二成分([])是不包括a[1]的成分。

// step = 2
solutions = [9], [6]

在第二步中,我们将a[2] = 9添加到之前的解决方案中,该解决方案不包括a[1](即第二个组件-[])。然后,我们选择前两个解决方案中的最佳方案作为第二个组件。从这里开始,我们重复相同的过程:

// step = 3
solutions = [6, 1], [9]
// step = 4
solutions = [9, 2], [9]
// step = 5
solutions = [9, 8], [9, 2]
// step = 6
...

您还需要跟踪哪个解决方案(如果有的话)包含a[1],因为在最后一步,我们不应该将a[n]添加到已经包含a[1]的解决方案中。这些信息(可以是布尔标志)可以与两个解决方案组件中的每一个相关联,并在我们前进的过程中随每个步骤更新。

最新更新