状态机DP无冷却期股票问题II
题目
给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。然而,你可以在 同一天 多次买卖该股票,但要确保你持有的股票不超过一股。
返回 你能获得的 最大 利润 。
示例
1 | 输入:prices = [7,1,5,3,6,4] |
解题思路
这是一个状态DP的题目,这个题包含了四种不同情况,我们先假定1是持有股票,0是不持有股票,那么第i天的总利润实际上的公式可以写成:dfs[i]=dfs[i-1]+prices[i],这里就包含了四种情况,1.第i天我本身没有股票,要购入股票,那么这个时候实际上是-prices[i],持有状态从1变成0,2.第i天我本身持有股票,我现在要卖出股票,那么这个时候实际上是+princes[i],持有状态从0变成1,3.我本身没有股票,但是我什么也没做,持有状态还是保持1,4.我本身有股票,但是我什么也不做,持有状态还是保持0。这个时候我就可以写出一个递推方程了,这里还要注意最初状态不能持有股票。这里还有个小问题,就是递归会超时,所以使用了一个记忆数组来保存状态。
vector<array<int,2>>memo; 这里的 assign(prices.size(),array<int,2>{INT_MIN,INT_MIN}); 是vector的函数,表示用n个array填充这个vector
代码实现
1 | class Solution { |
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(n)
易错点
- 要先把买入卖出之间的状态转换搞清楚,搞清楚之后再进行效率的提高就行
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Decwoveh的学习周记!
评论
