Best Time to Buy and Sell Stock with Cooldown

来源:互联网 发布:大学公选课网络课 编辑:程序博客网 时间:2024/06/04 18:07

来源:http://segmentfault.com/a/1190000004193861


因为当前日期买卖股票会受到之前日期买卖股票行为的影响,首先考虑到用DP解决。

这道题比较麻烦的是有个cooldown的限制,其实本质也就是买与卖之间的限制。对于某一天,股票有三种状态: buy, sell, cooldown, sell与cooldown我们可以合并成一种状态,因为手里最终都没股票,最终需要的结果是sell,即手里股票卖了获得最大利润。所以我们可以用两个DP数组分别记录当前持股跟未持股的状态。然后根据题目中的限制条件,理清两个DP数组的表达式。

对于当天最终未持股的状态,最终最大利润有两种可能,一是今天没动作跟昨天未持股状态一样,二是昨天持股了,今天卖了。所以我们只要取这两者之间最大值即可,表达式如下:

sellDp[i] = Math.max(sellDp[i - 1], buyDp[i - 1] + prices[i]);

对于当天最终持股的状态,最终最大利润有两种可能,一是今天没动作跟昨天持股状态一样,二是前天还没持股,今天买了股票,这里是因为cooldown的原因,所以今天买股要追溯到前天的状态。我们只要取这两者之间最大值即可,表达式如下:

buyDp[i] = Math.max(buyDp[i - 1], sellDp[i - 2] - prices[i]);

最终我们要求的结果是

sellDp[n - 1] 表示最后一天结束时手里没股票时的累积最大利润

当然,这里空间复杂度是可以降到O(1)的,具体见第二种代码实现。



0 0
原创粉丝点击