非连续元素的最大总和(来自任何地方的k个元素)

时间:2011-03-29 14:56:50

标签: arrays algorithm dynamic-programming

对于“给定一个正整数数组的问题的改进版本,从这个数组中找到非连续元素的最有效算法是什么,当它们加在一起时,产生最大总和?”标准版本得到了很好的回答here

但是,如果您也可以从列表中的任何位置中选择指定数量的元素,无论它们是否连续,该怎么办?在这种情况下,您如何找到最大总和?

通过一个例子说明你正在建造房屋。你有n个房屋可供选择。每个地段都有与之相关的财务价值,如果你在那里建房子,你会得到X [i]。但是,由于分区法则,你不能在连续批次上建立(所以如果你建立在第5批,你不能建立在#4或#6上)。您希望以最大化价值的方式建造房屋。因此,如果H []是您要构建的房屋列表,则问题将是H[i] = max ((H(i-1), H(i-2) + X[i])).

但是现在,如果你有额外的k-zoning许可证(给你k的话)除了固定的批次之外你还可以在任何地方建造?

3 个答案:

答案 0 :(得分:2)

这可以通过简单的动态编程算法来解决:

  1. 创建元组列表(例如tuples);此列表包含两个对象:已构建房屋的总价值以及所选房屋清单(例如lots
  2. 将列表初始化为一个元素,值为0,空列表为
  3. 遍历所有可能的住房地段。每批L
  4. 遍历列表:对于列表中的每个元组T
  5. 如果房屋可以添加到住宅地块列表中(即列表中少于k个地块,并且添加L不会破坏非连续规则),则在该地块中创建另一个元素list,将T的值与此批次的构建值(您称之为X[i])相加,并将L添加到lots的{​​{1}}列表中}}。
  6. 循环浏览T,找到最大tuples的那个。住房地块的最佳选择存储在value的{​​{1}}
  7. 不确定这个的复杂性(n ^ 2 * k? - 现在无法思考)但总体来说并不太糟糕。

    关于这一点的好处是:通过一些聪明的编码,您可以将算法重用于任何规则集。只需使第5步接受外部条件。

答案 1 :(得分:1)

首先选择k个最佳元素,然后解决实例中的“最佳非连续整数”问题,而不用先前选择的元素。

答案 2 :(得分:1)

d[i][j] - 动态,如果第一个未使用的房屋是i并且我们已经使用了j奖金,我们可以采取多少措施。

d[0][0] = 0;  
d[i][j] = max(d[i-1][j], d[i-2][j] + x[i], d[i-1][j-1] + x[i]);