状态机DP无冷却期有交易次数股票问题III
题目
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例
1 | 输入:k = 2, prices = [2,4,1] |
解题思路
这道题的解决方案实际上承袭了II的思路,只不过有个地方需要考虑,它引入了一个至多交易次数,所以我们只需要再引入一个j作为一个次数的衡量基准就行了,II的题解见状态机DP无冷却期股票问题II,这里我们需要注意的是:每一天都有一个这样的表
| 最多允许卖出 j 次 | 不持有 hold = 0 | 持有 hold = 1 |
|—-|—-|—-|
| j = 0 | memo[i][0][0] | memo[i][0][1] |
| j = 1 | memo[i][1][0] | memo[i][1][1] |
| j = 2 | memo[i][2][0] | memo[i][2][1] |
我们需要用一个vector把他们包成一个数组,同时上面这个表格本身也是一个vector<array<int,2>>的一个数组,同时,买入和卖出这两个动作构成一个交易,所以在j变动的时候,只需要动一次就行。
代码实现
1 | class Solution { |
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(n)
易错点
这个j的取值非常容易混淆,并且也要详细理解为什么选择使用一个vector<vector<array<int,2>>>来构建这个memo
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Decwoveh的学习周记!
评论
