最大化利润总额

时间:2014-02-23 13:18:58

标签: algorithm

假设汽车价格每天波动,但在任何一天价格总是相同的。假设一个人在价格低的时候买,在价格高的时候卖掉。

但是对于每一天,只允许以下操作之一。

Buy one car.
Sale all cars that he owns
Do nothing

可以获得的最高金额是多少?

示例:假设我们有N(= 3)天,并且3天每天的汽车成本是{1,3,70},其中C [i]表示第i天的成本。然后是可以达到的最大金额在这种情况下获得的将是136

说明:他可以在前两天买一辆车,并在第三天卖掉它们。

如何找到最高金额?

2 个答案:

答案 0 :(得分:2)

让价格[k]为第#k天的汽车价格

maxP = -inf
for k = last_day downto first_day 
  P = Price[k]
  if P < maxP then
    Action[k] = "Buy one car"
  else
    maxP = P
    Action[k] = "Sale all cars that he owns"
  end if
end for
carsOwned = 0
sumEarned = 0
for k = first_day to last_day
  P = Price[k]
  if Action[k] == "Buy one car" then
    carsOwned += 1
    sumEarned -= P
  else
    sumEarned += P*carsOwned
    carsOwned = 0
  end if
end for
print(sumEarned)

此解决方案需要O(n)内存和O(n)时间。

答案 1 :(得分:1)

让我们从明显的开始 - 如果你知道价格最高的那一天(你的每日汽车价格数组中的最大值的指数),那么直到那天的最佳行动将是相当明显的每天买一辆车,并在最大的一天卖掉它们。

因此,解决此问题的一种算法是找到最大值,计算每天购买汽车并以最大值出售的子阵列[0:index_of_max]中的利润,并对剩余的阵列重复此过程。时间复杂度为O(n ^ 2)。