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

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

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

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

示例:

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

未持有股票和冷冻期设置为同一种状态dp1,持有股票设置为一种状态dp2。 未持有股票:保持之前的状态,即一直未持有股票,或者第i天卖掉了股票。dp1{i}=max{dp1{i-1},dp2{i-1}+p{i}}. 持有股票:保持之前的状态,或者今天买入了股票,dp2{i}=max{dp2{i-1},dp1{i-2}-p{i}}.今天能买入股票一定说明 之前没有股票或者冻结期,即dp1{i-2}.

class Solution {    public int maxProfit(int[] prices) {        if(prices.length==0)return 0;        int[] dp1=new int[prices.length];        int[] dp2=new int[prices.length];        dp2[0]=0;        dp1[0]=-prices[0];        for(int i=1;i<prices.length;i++){            dp1[i]=Math.max(dp1[i-1],i>=2?dp2[i-2]-prices[i]:-prices[i]);            dp2[i]=Math.max(dp2[i-1],dp1[i-1]+prices[i]);        }        return dp2[prices.length-1];    }}

原文地址:https://www.cnblogs.com/yihangZhou/p/10079658.html

时间: 2024-10-13 09:38:37

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

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

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

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

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比较,如

每日一题-——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(