Python 改装房客

Python 改装房客,python,list,algorithm,dynamic,Python,List,Algorithm,Dynamic,我一直在做一个小小的修改,来解决抢劫房屋的问题 我能够生成并编程递推关系,以找到最大总数 def mod_robber(arr): arr[1] = max(arr[0], arr[1]) for i in range(2, len(arr)): arr[i] = max(arr[i]+arr[i-2], arr[i-1]) return arr[-1] 不过,我想知道该抢劫哪些房子。例如;如果我给它数组[1,2,3,1],它会适当地返回4,但我希望它返回[1,3] 这是一

我一直在做一个小小的修改,来解决抢劫房屋的问题

我能够生成并编程递推关系,以找到最大总数

def mod_robber(arr):
  arr[1] = max(arr[0], arr[1])
  for i in range(2, len(arr)):
    arr[i] = max(arr[i]+arr[i-2], arr[i-1])
  return arr[-1]
不过,我想知道该抢劫哪些房子。例如;如果我给它数组[1,2,3,1],它会适当地返回4,但我希望它返回[1,3]

这是一种自下而上的方法,我用最新的最大值填充列表的每个索引,然后返回最后一个元素。所以在这个例子中,;[1,2,3,1]在运行循环后变为[1,2,4,4],其中4是我们的最大值

我暗自怀疑我应该反向遍历修改后的列表[1,2,4,4],并从最大值中减去。但我不太明白如何在所有情况下都能做到这一点

我还找到了一个帖子,问了一个类似的问题。但给出的所有答案都计算最大和,而不是返回适当的指数


非常感谢您的集体智慧。

您可以创建一个扩展了贡献索引的列表。因此,最初,每个值的贡献索引只有一个:它自己的索引。对于示例输入,我们将从以下内容开始:

[(1, (0,)), (2, (1,)), (3, (2,)), (1, (3,))]
然后是将两个条目正确地相加:

def mod_robber(arr):
    arr = [(val, (i,)) for i, val in enumerate(arr)]
    arr[1] = max(arr[0], arr[1])
    for i in range(2, len(arr)):
        arr[i] = max((arr[i-2][0] + arr[i][0], arr[i-2][1] + (i,)), arr[i-1]) 
    return arr[-1]
示例的输出为:

(4, (0, 2))

…这意味着最大值为4,贡献指数为0和2(从零开始的指数)。

请重复,并从下表开始。“演示如何解决此编码问题”不是堆栈溢出问题。我们希望您做出诚实的尝试,然后就您的算法或技术提出具体问题。堆栈溢出并不是为了取代现有的文档和教程。您似乎要求我们为您编写代码——只是为了更新和存储您找到的位置的坐标。有许多示例说明如何将结果附加到累加列表中。因此,你应该有一个完整的编码尝试,而不是一个片段和一个一般性的描述?因为那将是一个更长的帖子。我并不是真的要求别人为我写代码。更像是,还有什么其他方法?我试着保留并附加到一个单独的列表中。我试过向后遍历列表并进行减法。我甚至尝试过使用蛮力,生成所有可能的有效列表,并返回最大和的列表。这是唯一有效的方法,但速度非常慢。你最初的问题已经在“如何提问”中得到了回答。关于替代算法的开放式讨论在这里是离题的,如“主题”中所述。请参阅为这个问题选择合适的堆栈交换站点。啊!这是一种我没有想到的方法:跟踪索引!非常感谢你的投入。