假设汽车价格每天波动,但在任何一天价格总是相同的。假设一个人在价格低的时候买,在价格高的时候卖掉。
但是对于每一天,只允许以下操作之一。
Buy one car.
Sale all cars that he owns
Do nothing
可以获得的最高金额是多少?
示例:假设我们有N(= 3)天,并且3天每天的汽车成本是{1,3,70},其中C [i]表示第i天的成本。然后是可以达到的最大金额在这种情况下获得的将是136
说明:他可以在前两天买一辆车,并在第三天卖掉它们。
如何找到最高金额?
答案 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)。