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

又是一道找到了状态转移方程,就可以迎刃而解的问题

但是状态转移方程不好找啊

分析题目:

每一天的四种状态:买进、卖出、冷冻期、什么都不做

每天的状态排列遵循:买...卖冷...买...卖冷...  其中...代表什么都不做的日子,可能有多个

因为有的日子什么都不做,没办法指明某一天到底进行了哪种操作,所以将状态定为“这一天及之前进行的最后操作”

第i天及以前,进行的最后操作为买进,所获得的最大收益:sell[i]

类似地定义buy[i] ,cool[i]

状态转移方程:

sell[i]=buy[i-1]+price[i]
buy[i]=max(cool[i-1]-prices[i],buy[i])
cool[i]=max(sell[i-1],cool[i-1])

代码:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int len = prices.size();
        if (len == 0)return 0;
        vector<int> sell(len), buy(len), cool(len);
        sell[0] = 0;
        buy[0] = -1*prices[0];
        cool[0] = 0;
        for (int i = 1;i < len;i++) {
            sell[i] = buy[i - 1] + prices[i];
            buy[i] = max(cool[i - 1] - prices[i], buy[i - 1]);
            cool[i] = max(sell[i - 1], cool[i - 1]);
        }
        int ans = max(sell[len-1], buy[len-1]);
        ans=max(ans,cool[len - 1]);
        return ans;
    }
};

原文地址:https://www.cnblogs.com/suuusu/p/11067697.html

时间: 2024-10-03 23:26:37

Leetcode 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. 未持

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天买进,第二项表示第

【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

[Leetcode188] 买卖股票的最佳时机IV 动态规划 解题报告

题源:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iv/ 本题代码: 1 /** 2 * @author yuan 3 * @version 0.1 4 * @date 2019/4/5 5 */ 6 public class Leetcode188 { 7 8 private int getBetterBuy(int[] buy, int[] sell, int price, int i) { 9 if (i

[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,

每日一题-——LeetCode(121)买卖股票的最佳时机

题目描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格.如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润.注意你不能在买入股票前卖出股票. 示例 输入: [7,1,5,3,6,4] 输出:5 定义:minval = min(minval,prices[i]) 当前的最小价格 maxp = max(maxp,prices[i]-minval) 当前的最大利润 class Solution(object): def maxProfit(