首页 > 其他分享 >买卖股票的最佳时机含冷冻期

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

时间:2024-09-09 22:52:37浏览次数:3  
标签:状态 买卖 持有 股票 最佳时机 prices 卖出 冷冻 dp

题目描述

给定一个整数数组prices,其中第  prices[i] 表示第 i 天的股票价格 。​

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

  • 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

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

示例 2:

输入: prices = [1]
输出: 0

提示:

  • 1 <= prices.length <= 5000
  • 0 <= prices[i] <= 1000

解题思路

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>> dp(n, vector<int>(3));
        dp[0][0] = -prices[0];
        for (int i = 1; i < n; i++) {
            // 昨天持有股票,今天继续持有;或者昨天前已出售,今天买入
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][2] - prices[i]);
            // 昨天持有股票,今天出售;
            dp[i][1] = dp[i - 1][0] + prices[i];
            // 昨天出售股票;或者昨天前已出售
            dp[i][2] = max(dp[i - 1][1], dp[i - 1][2]);
        }
        return max(dp[n - 1][1], dp[n - 1][2]);
    }
};
动态规划状态定义

dp[i][j] 表示第 i 天结束时的最大利润,其中 j 有三种状态:

  • dp[i][0]: 第 i 天结束时持有股票的最大利润。
  • dp[i][1]: 第 i 天结束时刚卖出股票的最大利润。
  • dp[i][2]: 第 i 天结束时不持有股票(并且没有在当天卖出)的最大利润。
初始状态
  • dp[0][0] 初始化为 -prices[0],因为第一天买入股票花费了 prices[0]
  • dp[0][1]dp[0][2] 可以初始化为 0,因为第一天不可能卖出股票。
状态转移方程
  • dp[i][0]: 第 i 天持有股票可能是继续持有前一天的股票,或者是第 i 天买入股票(前一天不持有股票),取这两种情况的较大值。

dp[i][0] = \max(dp[i-1][0], dp[i-1][2] - prices[i])

  • dp[i][1]: 如果第 i 天卖出股票,那么第 i-1 天一定是持有股票的状态。

dp[i][1] = dp[i-1][0] + prices[i]

  • dp[i][2]: 第 i 天如果不持有股票,可能是保持前一天卖出股票的状态,或者是继续不持有股票的状态,取较大值。 

dp[i][2] = \max(dp[i-1][1], dp[i-1][2])

最终结果

在所有交易日结束后,持有股票的利润不能算作最大利润,因此我们只需要在不持有股票的状态中找最大值。

\text{return} \max(dp[n-1][1], dp[n-1][2])

标签:状态,买卖,持有,股票,最佳时机,prices,卖出,冷冻,dp
From: https://blog.csdn.net/weixin_45092290/article/details/142071450

相关文章

  • 24暑假算法刷题 | Day41 | 动态规划 IX | LeetCode 188. 买卖股票的最佳时机 IV,309.
    目录188.买卖股票的最佳时机IV题目描述题解309.买卖股票的最佳时机含冷冻期题目描述题解714.买卖股票的最佳时机含手续费题目描述题解188.买卖股票的最佳时机IV点此跳转题目链接题目描述给你一个整数数组prices和一个整数k,其中prices[i]是某支给定......
  • 714. 买卖股票的最佳时机含手续费(leetcode)
    https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/classSolution{publicintmaxProfit(int[]prices,intfee){//f[i][j]表示前i天进行交易购买,j=0表示持有股票,j=1表示未持有股票,划分两个状态//f[i][0]=......
  • 计算机毕业设计django+vue高校二手书买卖系统的设计与实现【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高等教育的普及和高校学生数量的增加,二手书市场在高校内逐渐兴起。然而,传统的二手书交易方式往往存在信息不对称、交易效率低下等问题......
  • 122.买股票的最佳时机II
    122.买股票的最佳时机II给你一个整数数组prices,其中prices[i]表示某支股票第i天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候最多只能持有一股股票。你也可以先购买,然后在同一天出售。返回你能获得的最大利润。示例1:输入:prices=......
  • 招商银行信用卡中心2019秋招IT笔试——比特币最佳买卖时机
    给定一个正整数数组,它的第 i 个元素是比特币第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一次),设计一个算法来计算你所能获取的最大利润。注意你不能在买入比特币前卖出。时间限制:C/C++1秒,其他语言2秒空间限制:C/C++32M,其他语言64M输入描述:正整数数组,为......
  • 【dp力扣】买卖股票的最佳时机III
    目录审题通过动态规划固定套路思考:1、定义状态表示(关键)2、推导状态转移方程(重点)对于buy(可买入股票):回顾状态表示:第一种情况:第二种情况:联立两种情况(取两种情况的最大值):​对于own(持有股票)回顾状态表示:第一种情况:第二种情况:(最终结果)联立两种情况(还是取max):3、初......
  • 代码随想录算法day24 | 贪心算法part02 | 122.买卖股票的最佳时机II,55. 跳跃游戏,45.跳
    122.买卖股票的最佳时机II本题解法很巧妙,本题大家可以先自己思考一下然后再看题解,会有惊喜!力扣题目链接(opensnewwindow)给定一个数组,它的第 i个元素是一支给定股票第i天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次......
  • 代码随想录训练营 Day42打卡 动态规划 part09 188.买卖股票的最佳时机IV 309. 最佳买
    代码随想录训练营Day42打卡动态规划part09一、力扣188.买卖股票的最佳时机IV给你一个整数数组prices和一个整数k,其中prices[i]是某支给定的股票在第i天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成k笔交易。也就是说,你最多可以买k次......
  • 代码随想录day42 || 188 买卖最佳时机IV,309 买卖最佳时机含冷冻期,714 买卖最佳时机含
    188买卖最佳实际IV(k次机会交易)funcmaxProfit(kint,prices[]int)int{ //此题相比买卖两次条件改为买卖k次,所以dp数组行树需要增加为k*2+1 //dp[i][j]表示ifj%2==1第i天第j/3次持有股票获得的收益,j%2==0第i天第j/2次不持有获得的收益 //j%2==1dp[i][j]=......
  • 代码随想录day41 || 121 买卖股票最佳时机,122 买卖股票最佳时机||,123 买卖股票最佳时
    121买卖股票最佳时机funcmaxProfit(prices[]int)int{ //dp五部曲 //1dp数组以及下标含义dp[i][0]表示第i天持有股票dp[i][1]表示第i天不持有 //2递推公式,dp[i][0]=max(dp[i-1][0],0-price[i]) //dp[i][1]=max(dp[i-1][1],dp[i-1][0]+price[......