如何获取所选子数组中元素的总和

问题描述 投票:0回答:1

嘿伙计们,你能帮我解决这个问题吗?我通过了 20 个测试用例中的 7 个,我不知道我在这里做错了什么。

我尝试使用多种方法来解决这个问题,但没有任何结果。

可以对整数数组执行以下任务:

  1. 最多选择 x 次大小为 1 的 arr 子数组。
  2. 最多选择 y 次大小为 2 的 arr 子数组。
  3. 选择最多 z 次大小为 3 的 arr 子数组。

所选的子数组应该不重叠。

利润计算为所选子数组中元素的总和。可以获得的最大利润是多少?

例如,考虑数组 [1,2,3,4,5],其中 x、y 和 z 各等于 1。对于 x = 1,从数组中选择任意一个元素。它们的最大元素是 5,所以选择那个。这是这种情况下的最大利润。对于 y = 1,选择两个元素的任意子数组:[1,2]、[2,3]、[3,4] 或 [4,5]。 最后一个子数组的总和(利润)最高为 9。对于 z = 1,通过总和为 12 的子数组 [2,3,5] 获得最大利润。如果您可以选择其中一个,则最大利润将为通过忽略 x 然后使用 y 和 z 捕获 [1,2] 和 [3,4,5] 或 [1,2,3] 和 [4,5] 获得总利润 15。

Function Description: 
def calculateProfit(arr,x,y,z): 
constraints: 
1<=n<=200 
-10^5 <=arr[i] <= 10^5

Sample Input 0
5
3
1
0
0
Sample Output 0
5
Sample Input 1
4
-7
4
0
-7
0
1
0
Sample Output 1
4
Sample Input 2
4
-6
-3
-3
10
0
0
1
Sample Output 2
4

这是我的代码

def calculateProfit(arr, x, y, z):
    n = len(arr)
    max_prr = 0
    if x > 0:
        max_prr = max(max_prr, max(arr))
    if y > 0:
        for i in range(n - 1):
            subarr = arr[i:i+2]
            max_prr = max(max_prr, sum(subarr) + (max(arr) if len(subarr) == 1 else 0))
    if z > 0:
        for i in range(n - 2):
            subarr = arr[i:i+3]
            max_prr = max(max_prr, sum(subarr) + (max(arr[i+2:]) if len(subarr) == 1 else (max(arr[i:i+2]) if len(subarr) == 2 else 0)))
    return max_prr
python arrays algorithm data-structures sliding-window
1个回答
0
投票

我建议(未经测试,但应该有效)您更换:

if y > 0:
        for i in range(n - 1):
            subarr = arr[i:i+2]

from itertools import combinations
if y > 0:
        for subarr in combinations:
© www.soinside.com 2019 - 2024. All rights reserved.