【问题标题】:Modified House Robber改装强盗
【发布时间】:2021-07-16 02:37:28
【问题描述】:

我一直在对盗屋问题进行轻微修改。

我能够生成递归关系并对其进行编程以找到最大总数。

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] 在以 4 为最大值的循环运行后变为 [1, 2, 4, 4]。

我偷偷地怀疑我应该反向遍历修改后的列表 [1, 2, 4, 4],然后从最大值中减去。但我无法完全找到一种方法来使其在所有情况下都能正常工作。

我还发现了this 的帖子,问了一个类似的问题。但是给出的答案都是计算最大和,而不是返回适当的索引。

非常感谢您的集体智慧。

【问题讨论】:

  • 请从intro tour 重复on topichow to ask。 “告诉我如何解决这个编码问题”不是堆栈溢出问题。我们希望您做出诚实的尝试,然后然后就您的算法或技术提出一个具体的问题。 Stack Overflow 无意取代现有的文档和教程。
  • 您似乎在要求我们为您编写代码——只是为了更新和存储您找到的位置的坐标。有许多示例说明如何将结果附加到累积列表中。因此,您应该尝试完整的编码,而不是 sn-p 和一般描述。
  • 所以我应该复制/粘贴我之前所做的所有尝试?因为那将是一个更长的帖子。而且我并不是真的要求某人为我编写代码。更像是什么其他方法呢?我试过保留并附加到单独的列表中。我试过向后遍历列表并减去。我什至尝试了蛮力,生成所有可能的有效列表并返回具有最大总和的列表。这是唯一有效的方法,但速度非常慢。
  • 您最初的问题已经在“如何提问”中得到解答。如“主题”中所述,此处对替代算法的开放式讨论是题外话。请参阅all sites 为这个问题选择合适的 Stack Exchange 站点。

标签: python list algorithm dynamic


【解决方案1】:

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

[(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(从零开始的索引号)。

【讨论】:

  • 啊!这是我没有想到的一种方法:跟踪索引!非常感谢您的意见。
猜你喜欢
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2023-01-03
  • 2018-09-12
  • 2019-06-13
  • 1970-01-01
相关资源
最近更新 更多