【问题标题】:Maximum profit by buying and selling a share exactly k times通过恰好 k 次买卖股票来获得最大利润
【发布时间】:2017-06-19 15:24:50
【问题描述】:

每天债券的成本在数组prices 长度为n 中给出,我需要找到通过精确 @ 买卖可以获得的最大利润987654323@ 交易(按此顺序进行买卖。不是在同一天。但我可以在同一天卖出然后再买入)。

我试过(Python):

prices = [3, 1, 10]
n = len(prices)

def aux(i, j):
    if j == n - 1 or i == 0:
        return 0
    s = [(prices[j + t] - prices[j]) + aux(i - 1, j + t)
         for t in range(1, n - j)]
    return max(aux(i, j + 1), max(s)) if s else aux(i, j + 1)

def max_profit(k):
    return aux(k, 0)

但是对于代码中的给定数组,使用k=2,我得到9,而它应该是(1 - 3) + (10 - 1) = 7。它似乎在最多 k 次交易中获得了最大的利润,而不是恰好 k 次。

如何解决?

【问题讨论】:

  • 你能不能也提供一个输入和输出的例子,以便我可以处理它
  • @zenwraight 在代码示例中有prices = [3, 1, 10],我写了当你用k=2调用它时应该是什么
  • 1 买入并在10 卖出肯定能获得最大利润,应该是9 吗?还是有什么你没有告诉我们的?

标签: python algorithm dynamic-programming


【解决方案1】:

如果k 未被完全消耗,您的停止条件不应允许函数成功完成。试试这样的

if i == 0:
    return 0
elif j == n - 1:
    return -2**30

在第一种情况下,当i == 0 时,这意味着 k 被完全消耗掉了,我们不能再继续了。所以我们不能再输赢了,所以返回0。

现在,在第二个条件下,假设第一个不正确,这意味着我们到达了数组的末尾而没有完全消耗k。因此,这不是一个有效的答案。要将答案标记为无效,我们必须给它一个非常糟糕的值,以便与任何其他有效答案相比无论如何都会被拒绝。

由于这是一个最大化问题,一个不好的值意味着一个非常小的数字,所以当我们用其他答案最大化时,它总是会被丢弃。

-2**30 是一个非常接近整数最小值的值,所以它应该足够小。我假设您的所有操作都适合 32 位整数,因此这应该是一个足够小的值。如果这不是真的,您必须选择一个小值,足以小于您在有效答案中可以获得的最小值。您可以选择-2**60 甚至-2**100,因为这是 Python,您不必担心溢出问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 2017-09-26
    • 2016-08-29
    • 2021-04-22
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多