【问题标题】:Max Array Sum failing for some test cases某些测试用例的最大数组总和失败
【发布时间】:2020-04-07 14:25:57
【问题描述】:

所以首先我没有进行任何测试。只是练习有竞争力的编码。我正在从 Hacker Earth 解决这个问题。

Given an array of integers, find the subset of non-adjacent elements with the maximum sum. Calculate the sum of that subset.

我首先尝试使用动态编程方法进行求解。这是我写的:

def maxSubsetSum(arr):
if(len(arr)>2):
    #mainting this array for storing intermediate result and last element of this will always be max sum
    li=[0]*len(arr)
    li[0]=arr[0]
    li[1]=arr[1] if arr[1]>li[0] else li[0]
    for i in range(2,len(arr)):
        li[i] = max(li[i-1],arr[i]+li[i-2])
    return li[len(arr)-1]
else:
    return max(arr)

但不幸的是,在 33 个案例中,有 7 个案例失败了,这不是因为超时,而是因为答案错误。我想不出我的代码有什么问题。 我使用了一些 hackos 来获得隐藏的测试用例之一。 PFB 测试用例,非常庞大,所以上传到 pastebin

https://pastebin.com/GrM4gFJF

只是想知道代码中出了什么问题,导致某些测试用例失败

【问题讨论】:

  • 没有使用测试用例(没有使用过 pastebin),但是通过删除 range(2,len(..))range(len(..)) 给我第一个链接中测试用例的正确结果。你试过没有2吗?
  • 是的,它有效,但为什么?我的意思是理想情况下我已经计算了第 0 个和第 1 个索引的结果,所以我从 2 开始循环。

标签: python


【解决方案1】:

是的(回答您的评论),但请查看 for 循环的扩展运行。 您将前两个值存储在 li 中(根据li[1]=arr[1] if arr[1]>li[0] else li[0]),并在循环中根据列表(l[i-2]) 的前两个值执行计算,减去(参见循环 2,4)导致“完整”是结果在range(2 -2(即 l[0)。

used list [-2, 1, 3, -4, 5]
entering the for loop(full range)
loop number 0
intervals li[i-1]=0 : li=[0, 0, 0, 0, 0] : arr[i]=-2 : li[i-2]=0 : arr[i]+li[i-2]=-2 
loop number 1
intervals li[i-1]=0 : li=[0, 0, 0, 0, 0] : arr[i]=1 : li[i-2]=0 : arr[i]+li[i-2]=1 
loop number 2
intervals li[i-1]=1 : li=[0, 1, 0, 0, 0] : arr[i]=3 : li[i-2]=0 : arr[i]+li[i-2]=3 
loop number 3
intervals li[i-1]=3 : li=[0, 1, 3, 0, 0] : arr[i]=-4 : li[i-2]=1 : arr[i]+li[i-2]=-3 
loop number 4
intervals li[i-1]=3 : li=[0, 1, 3, 3, 0] : arr[i]=5 : li[i-2]=3 : arr[i]+li[i-2]=8 
final li=[0, 1, 3, 3, 8]
8
----------
used list [-2, 1, 3, -4, 5]
entering the for loop (2,x)
loop number 2
intervals li[i-1]=1 : li=[-2, 1, 0, 0, 0] : arr[i]=3 : li[i-2]=-2 : arr[i]+li[i-2]=1 
loop number 3
intervals li[i-1]=1 : li=[-2, 1, 1, 0, 0] : arr[i]=-4 : li[i-2]=1 : arr[i]+li[i-2]=-3 
loop number 4
intervals li[i-1]=1 : li=[-2, 1, 1, 1, 0] : arr[i]=5 : li[i-2]=1 : arr[i]+li[i-2]=6 
final li=[-2, 1, 1, 1, 6]
6

这使得第 0 和第 1 总和的初始计算变得不必要。试试吧。

希望它有所帮助,并在某种程度上阐明更多信息:)

建议的最终代码:

def maxSubsetSum(arr):
  if(len(arr)>2):
        #mainting this array for storing intermediate result and last element of this will always be max sum
        li=[0]*len(arr)

        for i in range(len(arr)):
            li[i] = max(li[i-1],arr[i]+li[i-2])

        return li[len(arr)-1]
  else:
      return max(arr)

【讨论】:

  • 完美!谢谢
猜你喜欢
  • 2017-12-08
  • 1970-01-01
  • 2020-02-16
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多