经典的最大化股票利润问题涉及一个包含股票价格的数组,您需要返回可以获得的最大利润:
我理解给定股票报价最大化利润的逻辑。以一种简单的方式,我们可以保持运行最小值和运行max_so_far,并检查当前elem是否小于min或当前elem - 运行min大于max_so_far,如果是,我们更新max_so_far
我们最终返回我们的max_so_far,这是可以获得的最大利润。
现在,我们如何解决2枪策略的问题?基本上,你需要返回i0,j0,i1,j1,使得arr [j0] -arr [i0]和arr [j1] -arr [i1]之和最大,并且i0 我能够在某种程度上思考,但后来无法弄清楚我如何能够概括它。所以,第一,我可以获得包含所有max_so_far元素的单发解决方案数组。同样,我可以做一个类似的数组,但是从arr [n-1]开始到0.这告诉我今天是否必须卖掉,我可以获得的最大利润是多少。如果我在前向迭代中添加数组中的相应元素,并在后向迭代中添加数组,并且我从中获取max元素,那么这对应于max i0,j0,i1,j1 但有人可以先解释k shot算法的逻辑。我想我会想要了解如何将2镜头策略扩展到k镜头的k-shot策略。 感谢
答案 0 :(得分:0)
一个概括是保持2k + 1元素数组,其中j th 条目(从零开始计算)是j交易交替买卖后的最大现金。如果j是偶数,则下一笔交易是买入。如果j是奇数,则下一笔交易是卖出。
最初,数组为0,-inf,-inf,...,-inf(负无穷大意味着该条目不可行)。当下一个价格p进入时,按顺序更新索引2k,2k-1,...,1处的元素,如下所示。 2k的最佳交易是(i)前一个条目的最大值,表示2k个先前的交易(ii)2k-1加上p的条目,表示先前2k-1个交易,然后是p。 2k-1的最佳交易是(i)前一个条目的最大值,表示2k-1个先前交易(ii)2k-2减去p的条目,表示先前2k-2个交易,然后是p。继续交替加减。
我将把恢复买/卖时机的问题留作练习。