Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在随机数组中选择元素以最大化输出的最佳顺序?_Arrays_Algorithm_Dynamic Programming - Fatal编程技术网

Arrays 在随机数组中选择元素以最大化输出的最佳顺序?

Arrays 在随机数组中选择元素以最大化输出的最佳顺序?,arrays,algorithm,dynamic-programming,Arrays,Algorithm,Dynamic Programming,我们有一个数组作为生产的输入 R=[5,2,8,3,6,9] 如果选择了ith输入,则输出为ith元素、索引小于i的最大元素和索引大于i的最小元素之和 例如,如果我取8,输出将是8+5+3=16 无法再次选择所选项目。因此,如果我选择8,下一次选择的下一个数组将看起来像R=[5,2,3,6,9] 选择总输出最大的所有输入的顺序是什么?如果可能的话,请发送动态规划解决方案。我将以O(n2n)解决方案开始竞标 你对这个问题的描述有很多含糊不清的地方,你拒绝在评论中提及。这些模糊性都不会影响此解决方案

我们有一个数组作为生产的输入

R=[5,2,8,3,6,9]

如果选择了
i
th输入,则输出为
i
th元素、索引小于
i
的最大元素和索引大于
i
的最小元素之和

例如,如果我取8,输出将是8+5+3=16

无法再次选择所选项目。因此,如果我选择8,下一次选择的下一个数组将看起来像
R=[5,2,3,6,9]


选择总输出最大的所有输入的顺序是什么?如果可能的话,请发送动态规划解决方案。

我将以O(n2n)解决方案开始竞标

你对这个问题的描述有很多含糊不清的地方,你拒绝在评论中提及。这些模糊性都不会影响此解决方案的运行时复杂性,但它们确实会影响解决方案的实现细节,因此该解决方案在一定程度上是一个草图

解决办法如下:

  • 创建一个包含2n个整数的数组
    结果
    。每个数组索引
    i
    将表示输入的某个子序列,而
    results[i]
    将是我们从该子序列开始可以实现的最大总和

    • 管理索引到子序列映射的一种方便方法是使用最低有效位(1的位置)表示输入的第一个元素,使用2的位置表示第二个元素,等等。;因此,例如,如果我们的输入是
      [5,2,8,3,6,9]
      ,那么子序列
      5,28
      将表示为数组索引0001112=7,这意味着
      结果[7]
      。(您也可以从最重要的位开始—这可能更直观—但该映射的实现就不那么方便了。由您决定。)
  • 然后依次从子集#0(空子集)到子集#2n−1(完整输入),通过查看选择每个可能的元素并添加相应的先前存储的值可以得到多少来计算每个数组元素。因此,例如,为了计算
    结果[7]
    (对于子序列
    5 2 8
    ),我们选择这些值中的最大值:

    • 结果[6]
      加上如果我们选择
      5
    • 结果[5]
      加上选择
      2
    • 结果[3]
      加上如果我们选择
      8

    现在,计算任何给定的数组元素似乎需要O(n2)个时间,因为在输入中有n个元素是我们可以选择的,如果我们这样做的话,我们需要检查所有其他元素(找到先前元素中的最大值和后面元素中的最小值)。然而,我们实际上可以在O(n)时间内完成这项工作,首先从右向左传递以记录比输入的每个元素都晚的最小值,然后从左向右尝试每个可能的值。(两次O(n)通过加起来就是O(n)。)


一个重要的警告:我怀疑正确的解决方案只涉及在每个步骤中选择最右边的元素或从第二个到最右边的元素。如果是这样的话,那么上面的解决方案计算的值比考虑到这一点的算法要多得多。例如,在这种情况下,索引1110002处的结果显然不相关。但是我不能证明这个怀疑,所以我提出上面的O(n2n)解是最快的解,我确信它的正确性。

(我假设元素是非负的,没有相反的建议。)

这是一个O(n^2)-时间算法,基于ruakh的猜想,存在一个最优解,其中每个选择都来自最右边的两个,我在下面证明

DP的状态为(1)
n
,剩余元素数(2)
k
,最右边元素的索引。我们又复发了

OPT(n, k) = max(max(R(0), ..., R(n - 2)) + R(n - 1) + R(k) + OPT(n - 1, k),
                max(R(0), ..., R(n - 1)) + R(k) + OPT(n - 1, n - 1)),
其中第一行是我们取第二个最右边的元素,第二行是我们取最右边的元素。最大值为零。基本情况如下:

OPT(1, k) = R(k)
对于所有
k


证明:从最右边的两个元素中选择的条件相当于仅当最多保留
i+2
元素时才能选择索引
i
(从零开始计数)处的元素的限制。我们通过归纳证明,对于所有
i
存在满足此条件的最优解,其中
j
是归纳变量


基本情况很简单,因为每个最优解都满足
j=0
的真空限制。在归纳情况下,假设存在满足所有
i
约束的最优解。如果选择了<>代码> J/<代码>,当有超过<代码> J+ 2 元素时,让我们考虑一下,如果我们推迟选择,直到完全存在“代码> J+ 2 < /COD>元素”时会发生什么。
j
剩下的元素没有一个是在这个区间内由归纳假设选择的,因此它们是不相关的。选择
j
右边的元素至少也同样有利,因为包含
j
不能减少最大值。同时,
j
左边的元素集在两次都是相同的,
j
右边的元素集是较前一次晚的一个子集,因此,最小值不会减小。我们得出的结论是,这种延迟不会影响解决方案的盈利能力。

我不知道您所说的“I左侧的max元素和I右侧的min元素”是什么意思——min和max在哪里进行的?在你的例子中,它只是三个元素R[i]+R[i-1]+R[i]的和