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