买入和卖出股票的最大利润恰好是k次

时间:2017-06-19 15:24:50

标签: python algorithm dynamic-programming

每天债券的成本以长度prices的数组n给出,我需要通过确切<买卖来找到我可以赚取的最大利润/ strong> k交易(按此顺序买卖。不是在同一天。但我可以在同一天卖出然后买。)

我试过(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时,我会得到inorder' :: (b -> a -> b) -> b -> BinaryTree a -> b inorder' _ a myTree = a inorder' fun a (Node left root right) = inorder' fun (fun root (inorder' fun a left)) right 。它似乎获得了最多k个交易的最大利润,而不是k。

如何解决?

1 个答案:

答案 0 :(得分:0)

如果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,您不必担心溢出问题。