该程序在Python中查找两个不重叠子列表的最大和

假设我们有一个数字列表,分别称为nums和两个值x和y,我们必须找到两个不重叠的子列表(以num为单位)的最大和,长度分别为x和y。

因此,如果输入像nums = [3,2,10,-2,7,6] x = 3 y = 1,则输出将为22,因为长度为3的子列表我们选择[3,2, 10],另一个选择[7]。

为了解决这个问题,我们将遵循以下步骤-

  • P:=具有单个元素0的列表

  • 对于A中的每个x

    • 在P的末尾插入(P + x的最后一个元素)

  • 定义一个功能solve()。这将需要len1,len2

  • Q:=每个元素i(P [i + len1]-P [i])的列表,范围从0到P-len1的大小

  • 前缀:= Q的副本

  • 对于范围在0到前缀大小-1之间的i

    • prefix [i + 1]:= prefix [i + 1]和prefix [i]的最大值

  • ans:= -infinity

  • 对于len1到P-len2大小的i,执行

    • 左:=前缀[i-len1]

    • 右:= P [i + len2]-P [i]

    • ans:= ans和(左+右)的最大值

  • 返回ans

  • 从主要方法中执行以下操作-

  • 返回最大的solve(len1,len2),solve(len2,len1)

让我们看下面的实现以更好地理解-

示例

class Solution:
   def solve(self, A, len1, len2):
      P = [0]
      for x in A:
         P.append(P[-1] + x)
      def solve(len1, len2):
         Q = [P[i + len1] - P[i] for i in range(len(P) - len1)]
         prefix = Q[:]
         for i in range(len(prefix) - 1):
            prefix[i + 1] = max(prefix[i + 1], prefix[i])
            ans = float("-inf")
            for i in range(len1, len(P) - len2):
               left = prefix[i - len1]
               right = P[i + len2] - P[i]
            ans = max(ans, left + right)
            return ans
         return max(solve(len1, len2), solve(len2, len1))
ob = Solution()nums = [3, 2, 10, -2, 7, 6]
x = 3
y = 1
print(ob.solve(nums, x, y))

输入值

[3, 2, 10, -2, 7, 6], 3, 1

输出结果

22