特殊条件下数组中的最大和

时间:2018-11-28 12:48:18

标签: algorithm dynamic-programming

假设我们有一个包含n个元素的数组(n%3 = 0)。在每一步中,从数组中提取一个数字。您可以选择最左边或最右边的一个。如果选择左边的数字,则将此元素添加到总和中,并删除右边的两个数字,反之亦然。

示例:A = [100,4,2,150,1,1],总和=0。

  1. 采用最左边的元素。 A = [4,2,150]总和= 0 + 100 = 100

2。选择最右边的元素。 A = []总和= 100 + 150 = 250

因此,A的结果应为250,并且序列应为Left,Right。

如何计算数组中可以得到的最大和?以及如何确定必须提取元素的顺序?

我想这个问题最好通过动态编程解决,然后可以通过回溯确定具体顺序。

1 个答案:

答案 0 :(得分:5)

可以通过以下动态编程解决基本问题。可以通过让

来定义状态空间
M(i,j) := maximum value attainable by chosing from the subarray of
          A starting at index i and ending at index j
          for any i, j in {1, N} where `N` is the number of elements
          in the input.

其中重复关系如下。

M(i,j) = max { M(i+1, j-2) + A[i], M(i+2, j-1) + A[j] }

这里,第一个值对应于选择添加数组的开头,而第二个值对应于选择减去数组的结尾。基本情况是值0的状态,其中i=j