对于“给定一个正整数数组的问题的改进版本,从这个数组中找到非连续元素的最有效算法是什么,当它们加在一起时,产生最大总和?”标准版本得到了很好的回答here。
但是,如果您也可以从列表中的任何位置中选择指定数量的元素,无论它们是否连续,该怎么办?在这种情况下,您如何找到最大总和?
通过一个例子说明你正在建造房屋。你有n个房屋可供选择。每个地段都有与之相关的财务价值,如果你在那里建房子,你会得到X [i]。但是,由于分区法则,你不能在连续批次上建立(所以如果你建立在第5批,你不能建立在#4或#6上)。您希望以最大化价值的方式建造房屋。因此,如果H []是您要构建的房屋列表,则问题将是H[i] = max ((H(i-1), H(i-2) + X[i])).
但是现在,如果你有额外的k-zoning许可证(给你k的话)除了固定的批次之外你还可以在任何地方建造?
答案 0 :(得分:2)
这可以通过简单的动态编程算法来解决:
tuples
);此列表包含两个对象:已构建房屋的总价值以及所选房屋清单(例如lots
)L
:T
:L
不会破坏非连续规则),则在该地块中创建另一个元素list,将T
的值与此批次的构建值(您称之为X[i]
)相加,并将L
添加到lots
的{{1}}列表中}}。T
,找到最大tuples
的那个。住房地块的最佳选择存储在value
的{{1}} 不确定这个的复杂性(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]);