leecode 309. 最佳买卖股票时机含冷冻期

/*****
//sell[i]表示截至第i天,最后一个操作是卖时的最大收益;
//buy[i]表示截至第i天,最后一个操作是买时的最大收益;
//cool[i]表示截至第i天,最后一个操作是冷冻期时的最大收益;
//递推公式:
//sell[i] = max(buy[i-1]+prices[i], sell[i-1]) (第一项表示第i天卖出,第二项表示第i天冷冻)
//buy[i] = max(cool[i-1]-prices[i], buy[i-1]) (第一项表示第i天买进,第二项表示第i天冷冻)
//cool[i] = max(sell[i-1], cool[i-1]) (第一项表示第i-1天卖出,第二项表示第i-1天之前卖出)
****/
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int len=prices.size();
        if(len<=1) return 0;
        vector<int>sell(len,0);
        vector<int>buy(len,-prices[0]);
        vector<int>cool(len,0);
        for(int i=1;i<len;i++){
            int p=prices[i];
            sell[i]=max(buy[i-1]+p,sell[i-1]);//
            buy[i]=max(buy[i-1],cool[i-1]-p);//前一天必须冷冻期才能买入
            cool[i]=max(sell[i-1],cool[i-1]);//前一天要么卖出,要么是冷冻期
        }
        return sell[len-1];
    }
};

原文地址:https://www.cnblogs.com/joelwang/p/10868665.html

时间: 2024-10-17 21:53:39

leecode 309. 最佳买卖股票时机含冷冻期的相关文章

Leetcode之动态规划(DP)专题-309. 最佳买卖股票时机含冷冻期(Best Time to Buy and Sell Stock with Cooldown)

股票问题: 309. 最佳买卖股票时机含冷冻期 714. 买卖股票的最佳时机含手续费 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 .? 设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票). 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天). 示例: 输入: [1,2,3,0,2] 输出: 3 解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入,

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

给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 .? 设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票). 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天). 示例: 输入: [1,2,3,0,2] 输出: 3 解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出] 未持有股票和冷冻期设置为同一种状态dp1,持有股票设置为一种状态dp2. 未持

Leetcode 309 最佳买卖股票时机含冷冻期 (动态规划)

又是一道找到了状态转移方程,就可以迎刃而解的问题 但是状态转移方程不好找啊 分析题目: 每一天的四种状态:买进.卖出.冷冻期.什么都不做 每天的状态排列遵循:买...卖冷...买...卖冷...  其中...代表什么都不做的日子,可能有多个 因为有的日子什么都不做,没办法指明某一天到底进行了哪种操作,所以将状态定为“这一天及之前进行的最后操作” 第i天及以前,进行的最后操作为买进,所获得的最大收益:sell[i] 类似地定义buy[i] ,cool[i] 状态转移方程: sell[i]=buy[

【LeetCode-面试算法经典-Java实现】【121-Best Time to Buy and Sell Stock(最佳买卖股票的时间)】

[121-Best Time to Buy and Sell Stock(最佳买卖股票的时间)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Say you have an array for which the ith element is the price of a given stock on day i. If you were only permitted to complete at most one transaction (ie, buy one

最佳买卖股票时间

题目: 给出一个数组,第i个数代表第i天的价格,请选择一种策略,使得收益最大.每天仅能买卖一次 答案: // 找出所有上涨区间,每个区间的第一天买.最后一天卖 // 输入int a[], length bool hasPos = false; // 是否有持仓 for (int i = 0; i < length - 1; i++) { if (a[i + 1] < a[i]) // 明天价格下跌 { if (hasPos) a[i] = -1; // 如果有持仓就卖 else a[i] =

Leetocode全部5道买卖股票问题总结(121+122+123+188+309)

题目1----121. 买卖股票的最佳时机I: 链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/ 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 解答: 限制只能买入卖出一次 DP1: buy[i]记录截止到第i天是买入的状态的最小花费(值为负数) 1 class Solution { 2 pub

[LeetCode] 123. Best Time to Buy and Sell Stock III 买卖股票的最佳时间 III

Say you have an array for which the ith element is the price of a given stock on day i. Design an algorithm to find the maximum profit. You may complete at most two transactions. Note:You may not engage in multiple transactions at the same time (ie,

Leecode刷题之旅-C语言/python-121买卖股票的最佳时机

/* * @lc app=leetcode.cn id=121 lang=c * * [121] 买卖股票的最佳时机 * * https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/description/ * * algorithms * Easy (48.50%) * Total Accepted: 32.5K * Total Submissions: 66.9K * Testcase Example: '[7,1,5

122. 买卖股票的最佳时机 II

https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/solution/ 暴力 本题可以多次买卖股票,如果只允许一次买卖股票,整个暴力就是n2的算法,如果可以无限制买卖股票直接用普通的写法不是很好写,可以用递归来解决.先考虑只允许一次买卖的暴力解法,双层循环,外层循环i代表买入股票的时机,内层j循环从i+1开始,代表买入股票后的股票价格,如果发现prices[j]>prices[i]就尝试卖掉并和全局max比较,如