圆中的最大子连续总和

时间:2012-12-05 23:38:20

标签: arrays algorithm

问题是我有一个充满n个数字的数组。我必须确定最大总和,但是,如果将位置i中的数字加到总和中,则无法添加数字i-1和i + 1.

n号被认为是在cicle中。

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

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

2 个答案:

答案 0 :(得分:1)

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

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

现在你得到了两种可能情况的答案 - 要么包含第一个元素,要么不包括 - 所以选择最好的。

PS - 如果这不是作业,那么实际上有一个有用的应用吗?它是什么?

答案 1 :(得分:0)

我认为你的问题很有意思但不想回应,因为你没有表现出自己的努力。

无论如何,既然mcdowella回答了这个问题,我会尝试再详细说明他的答案。

我们来看一下输入数组:

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]的解决方案中。这些信息(可以是一个布尔标志)可以与两个解决方案组件中的每一个相关联,并在我们进行的每个步骤中进行更新。