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