【问题标题】:Given a spacing, finding the largest sum of numbers in an array给定一个间距,找到数组中最大的数字总和
【发布时间】:2021-04-18 00:21:20
【问题描述】:

假设我们有一个包含一些数字的数组,我们得到一个值 d(其中 d >= 1),它指示某个所需的索引。我们如何找到以 d 为界的值的最大总和。这是一个例子:

arr = [3000, 4000, 2000, 2500, 3500, 5000]
d = 3

将返回 4000 + 5000 = 9000(因为这两个数字之间的距离至少为 3)。但在这种情况下:

arr = [3000, 4000, 2000, 2500, 3500, 5000]
d = 2

将返回 4000 + 2500 + 5000 = 11500。

edit:更多解释 - 我们需要在数组中找到最大可能的总和。唯一的技巧是我们不能包含小于 d 索引的数字。在第二个示例中,我们可以轻松地将所有数字相加以获得最大值,但由于我们以 d = 2 为界,我们必须选择一个数字不小于距离 2 的组合。另一个示例可能包括 3000 + 2500 + 5000 = 10500。如果您查看我的第二个解决方案 11500 > 10500,因此这不是最佳答案

【问题讨论】:

  • 你能解释一下第二种情况吗?
  • 我认为语言需要加强。正如给定的那样,它可以用不同的方式来解释。例如,我不知道“以 d 为界”是什么意思。
  • 我相信这个想法是找到一个最大和子序列[A[i1], A[i2], ...],使得每个索引之间的差异至少是d
  • 您的问题需要进一步澄清

标签: python-3.x algorithm subsequence maximization


【解决方案1】:

使用动态规划方法可以有效地解决这个问题。

A 为输入数组,d 为间隙大小。然后,您可以构造一个数组B,使得B[i]A 的第一个i+1 元素的最大和。您可以通过简单的递归计算B 的元素,最后一个元素包含解:

def solve(A, d):
    n = len(A)
    B = [0] * n
    B[0] = A[0]
    for i in range(1, d):
        B[i] = max(A[i], B[i-1])
    for i in range(d, n):
        B[i] = max(A[i] + B[i-d], B[i-1])
    return B[-1]

【讨论】:

    【解决方案2】:

    您可以通过迭代计算每个前缀的最佳总和来一次性完成。

    一旦你有每个前缀的最佳总和,但不包括i,对于i,最佳总和要么不包括元素i(因此等于prefix_sums[i - 1]),要么包括元素i,因此等于i + prefix_sums[i - d](获取元素i,以及距离d至少为d的元素的最佳总和)。

    a = [3000, 4000, 2000, 2500, 3500, 5000]
    d = 2
    
    prefix_sums = [a[0]]
    for x in a[1:]:
        cur = x if len(prefix_sums) < d else x + prefix_sums[-d]
        cur = max(cur, prefix_sums[-1])
        prefix_sums.append(cur)
    
    print(max(prefix_sums))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      • 1970-01-01
      • 2021-08-09
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      • 2023-01-13
      相关资源
      最近更新 更多