前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【LeetCode】309. 最佳买卖股票时机含冷冻期

【LeetCode】309. 最佳买卖股票时机含冷冻期

作者头像
韩旭051
发布2020-07-13 14:33:23
2850
发布2020-07-13 14:33:23
举报
文章被收录于专栏:刷题笔记刷题笔记

给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。​

设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。 示例:

输入: [1,2,3,0,2] 输出: 3 解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

动态规划

出售两种状态 冷冻 不冷冻

股票两种 持有 不持有

组合三种情况

持有 不冷冻

不持有 冷冻

不持有 不冷冻

(持有 冷冻 不存在)

1. 持有 不冷冻 前一天 可以是 持有 不冷冻 或者 不持有 不冷冻 ( f[i][0] = max(f[i - 1][0], f[i - 1][2] - prices[i]);)贪心留最佳

2. 不持有 冷冻 前一天 可以是 持有 不冷冻 f[i][1] = f[i - 1][0] + prices[i];

3. 不持有 不冷冻 前一天 可以是 不持有 冷冻 也可以是 不持有不冷冻 f[i][2] = max(f[i - 1][1], f[i - 1][2]);

最后 肯定要售出 才保证 利润最大化 return max(f[n - 1][1], f[n - 1][2]);

代码语言:javascript
复制
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if (prices.empty()) {
            return 0;
        }

        int n = prices.size();
        // f[i][0]: 手上持有股票的最大收益
        // f[i][1]: 手上不持有股票,并且处于冷冻期中的累计最大收益
        // f[i][2]: 手上不持有股票,并且不在冷冻期中的累计最大收益
        vector<vector<int>> f(n, vector<int>(3));
        f[0][0] = -prices[0];
        for (int i = 1; i < n; ++i) {
            f[i][0] = max(f[i - 1][0], f[i - 1][2] - prices[i]);
            f[i][1] = f[i - 1][0] + prices[i];
            f[i][2] = max(f[i - 1][1], f[i - 1][2]);
        }
        return max(f[n - 1][1], f[n - 1][2]);
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/07/10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 动态规划
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档