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