动态编程最大序列

时间:2015-11-07 16:16:11

标签: arrays dynamic sequence

我在股票交易中工作。我有两个代表货币的数组。

我希望能够在两个数组中找到最大序列。

但是,当我在两个数组之间进行更改时,我需要支付20英镑的固定成本

例如:

阵列1:12,21,45,10,42 阵列2:52,3,4,10,35

如何使用动态编程来解决此问题。

即。找到序列的最大权重。

1 个答案:

答案 0 :(得分:0)

DP解决方案的第一个明显尝试是定义一个最大的数组P [i] 交易1到i可达到的权重。问题是,为了更新这个数组,我们需要 知道我们在上一个指数中的位置,因为我们需要知道是否需要收取20英镑的变更票价。

我们将通过添加一个额外的参数来控制这个额外的条件信息 对于位置(Array1或Array2),我们在最后一个事务中。

P [i,A1] =最大(序列)交易1到i,假设交易i在A1中

假设交易i在A2中,则p [i,A2] =最大(序列)交易1到i。

对于基础案例,假设我们从A1开始,我们 没有固定成本,所以我们有P [0,A1] = 0。

另一方面,如果我们想要入手 A2,我们需要付钱才能到达那里,因此,P [0,A2] = -20。

注意如果我们从A2开始而不是A1 ,我们可以更改基础情况,但我假设我们必须从A1开始。如果你可以从任何一个开始,你可以计算两种方式,并通过以下步骤找到两者的最大值。

一般来说,对于i> 0,为了计算P [i,A1],我们考虑两种可能性,这取决于我们最后一次交易的位置。

如果我们在A1,我们不需要承担成本,并且我们在交易i - 1的任何价值之上获得A [i]的值。因此,我们

P [i, A1] = A1[i] + P [i − 1, A1].

另一方面,如果我们在A2最后一次交易中,我们需要支付20的产生费用,但我们仍然从第一次i-1交易中获得A1交易和应计利润。在这种情况下,我们

P[i, A1] = A1[i] + P [i − 1, A2] − 20.

我们有两个以下递归规则:

P [i, A1] = A1[i] + max(P [i − 1, A1], P [i − 1, A2] − 20).
P [i, A2] = A2[i] + max(P [i − 1, A2], P [i − 1, A1] − 20).

一旦我们成功计算出值P [i,A1]和P [i,A2],对于0≤i≤n,我们返回 max的P [n,A1]和P [n, A2] 作为最终结果