首页 > 编程语言 >代码随想录算法训练营第四十八天 | 188.买卖股票的最佳时机IV 309.买卖股票的最佳时机含冷冻期 714.买卖股票的最佳时机含手续费

代码随想录算法训练营第四十八天 | 188.买卖股票的最佳时机IV 309.买卖股票的最佳时机含冷冻期 714.买卖股票的最佳时机含手续费

时间:2024-07-03 21:43:00浏览次数:18  
标签:vector 买卖 int 股票 最佳时机 max prices dp

188.买卖股票的最佳时机IV

题目链接 文章讲解 视频讲解

动规五部曲:

  • dp数组的含义:
    • dp[j][2*i-1] 表示第i次持有股票
    • dp[j][2*i] 表示第i次不持有股票
  • 递推公式:
    • dp[j][2i-1] = max(dp[j-1][2i-1], dp[j-1][2*i-2] - prices[j]);
    • dp[j][2i] = max(dp[j-1][2i], dp[j-1][2*i-1] + prices[j]);
  • 初始化:
    持有股票初始化为-prices[0]
  • 遍历顺序:从小到大遍历
  • 打印dp数组
class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {
        // dp数组dp[0][0]:不操作
        // dp[0][2 * i - 1]:第i次持有
        // dp[0][2 * i]: 第i次不持有
        vector<vector<int>> dp(prices.size(), vector<int>(2 * k + 1, 0));
        
        // 初始化2 * i - 1初始化为-prices[0];
        for(int i = 1; i <= k; ++i) {
            dp[0][2 * i - 1] = -prices[0];
        }

        for(int j = 1; j < prices.size(); ++j) {
            for(int i = 1; i <= k; ++i) {
                dp[j][2*i-1] = max(dp[j-1][2*i-1], dp[j-1][2*i - 2] - prices[j]);
                dp[j][2*i] = max(dp[j-1][2*i], dp[j-1][2*i - 1] + prices[j]);
            }
        }

        return dp[prices.size()-1][2*k];
    }
};

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

题目链接 文章讲解 视频讲解

动规五部曲:

  • dp数组的含义
    • dp[j][0] 持有股票
    • dp[j][1] 保持卖出股票
    • dp[j][2] 具体卖出股票
    • dp[j][3] 冷冻期
  • 递推公式:
    • dp[j][0] = max(dp[j-1][0], max(dp[j-1][3] - prices[j], dp[j-1][1] - prices[j]));
    • dp[j][1] = max(dp[j-1][3], dp[j-1][1]);
    • dp[j][2] = dp[j-1][0] + prices[j];
    • dp[j][3] = dp[j-1][2];
  • 初始化
    • dp[0][0] = -prices[0];
    • dp[0][1] = 0;
    • dp[0][2] = 0;
    • dp[0][3] = 0;
  • 遍历顺序:从前向后
  • 打印dp数组
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        vector<vector<int>> dp(prices.size(), vector<int>(4, 0));

        // 初始化
        dp[0][0] = -prices[0];

        for(int j = 1; j < prices.size(); ++j) {
            dp[j][0] = max(dp[j-1][0], max(dp[j-1][3] - prices[j], dp[j-1][1] - prices[j]));
            dp[j][1] = max(dp[j-1][3], dp[j-1][1]);
            dp[j][2] = dp[j-1][0] + prices[j];
            dp[j][3] = dp[j-1][2];
        }

        // 打印dp数组
        for(auto vec : dp) {
            for(int val : vec) cout << val << " ";
            cout << endl;
        }
        return max(dp[prices.size() - 1][2], max(dp[prices.size() - 1][1], dp[prices.size() - 1][3]));
    }
};

714.买卖股票的最佳时机含手续费

题目链接 文章讲解 视频讲解

动规五部曲:

  • dp数组的含义
    • dp[j][0] 持有股票
    • dp[j][1] 不持有股票
  • 递推公式:
    • dp[j][0] = max(dp[j-1][0], dp[j-1][1] - prices[j]);
    • dp[j][1] = max(dp[j-1][1], dp[j-1][0] + prices[j] - fee);
  • 初始化
    • dp[0][0] = -prices[0];
    • dp[0][1] = 0;
  • 遍历顺序:从前向后遍历
  • 打印dp数组
class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) {
        // dp[j][0] 持有股票
        // dp[j][1] 不持有股票
        vector<vector<int>> dp(prices.size(), vector<int>(2, 0));

        // 递推公式
        // dp[j][0] = max(dp[j-1][0], dp[j-1][1] - prices[j]);
        // dp[j][1] = max(dp[j-1][1], dp[j-1][0] + prices[j] - fee);

        // 初始化
        dp[0][0] = -prices[0];

        for(int j = 1; j < prices.size(); ++j) {
            dp[j][0] = max(dp[j-1][0], dp[j-1][1] - prices[j]);
            dp[j][1] = max(dp[j-1][1], dp[j-1][0] + prices[j] - fee);
        }
        
        return dp[prices.size() - 1][1];
    }
};

标签:vector,买卖,int,股票,最佳时机,max,prices,dp
From: https://www.cnblogs.com/cscpp/p/18282597

相关文章

  • 代码随想录算法训练营第四十六天 | 买卖股票的最佳时机
    121.买卖股票的最佳时机题目链接文章讲解视频讲解动规五部曲:dp[j][0]:表示持有股票的最大现金,dp[j][1]表示不持有股票的最大现金递推公式:第j天持有股票的最大现金为:之前就持有这只股票和今天持有这只股票取最大值:dp[j][0]=max(dp[j-1][0],-prices[j]);第j天不持有......
  • 【股票开通技巧】想在北京开个低佣金账户怎么开?股票交易佣金最低是多少?
     股票开通是指投资者向券商申请开通股票账户,通过股票账户可以进行股票交易。以下是股票开通的一些技巧:选择可靠的券商:选择信誉良好、服务优质的大型券商进行股票开通,这样可以保障交易的安全和稳定。熟悉开户流程:了解开户所需的材料和流程,包括身份证明、银行卡等,提前准备好......
  • 为啥说现在是升级到 Java 21最佳时机
    背景:基于NewRelic的年度“StateoftheJavaEcosystem”调查结果。对许多Java开发者仍在使用低版本Java感到沮丧。Java21的优势:SpringBoot3.x需要至少Java17,而Java21在技术上比Java8更优越,包括速度、安全性、易用性、性能和内存效率。Java21的道德优越性:使用......
  • 基于CNN的股票预测方法【卷积神经网络】
    基于机器学习方法的股票预测系列文章目录一、基于强化学习DQN的股票预测【股票交易】二、基于CNN的股票预测方法【卷积神经网络】文章目录基于机器学习方法的股票预测系列文章目录一、CNN建模原理二、模型搭建三、模型参数的选择(1)探究`window_size`的影响(2)探究`kerne......
  • 122.买卖股票的最佳时机(多次买卖)
    给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。返回 你能获得的 最大 利润 。示例1:输入:prices=[7,1,5,3,6......
  • C语言 | Leetcode C语言题解之第188题买卖股票的最佳时机IV
    题目:题解:intmaxProfit(intk,int*prices,intpricesSize){intn=pricesSize;if(n==0){return0;}k=fmin(k,n/2);intbuy[k+1],sell[k+1];memset(buy,0,sizeof(buy));memset(sell,0,sizeof(sell));......
  • 代码随想录算法训练营第46天 | 121. 买卖股票的最佳时机 、122.买卖股票的最佳时机II
    股票问题是一个动态规划的系列问题,前两题并不难,第三题有难度。买卖股票的最佳时机视频讲解:https://www.bilibili.com/video/BV1Xe4y1u77qhttps://programmercarl.com/0121.买卖股票的最佳时机.html/***@param{number[]}prices*@return{number}*/varmaxProfit=......
  • 如何使用ig507金融数据库的股票接口,股票API来获取MACD指标
    一、MACD指标简介MACD(MovingAverageConvergenceDivergence,移动平均收敛/发散)是一种趋势跟踪动量指标,用于分析股票或其他金融产品的价格趋势。MACD由两部分组成:差离值(DIF)和信号线(DEA)。DIF是短期(通常12天)指数移动平均线(EMA)与长期(通常26天)EMA的差值,再通过一个平滑期(通常9天)的EMA......
  • 如何使用ig507金融数据库的股票接口,股票API来获取MACD指标
    一、MACD指标简介MACD(MovingAverageConvergenceDivergence,移动平均收敛/发散)是一种趋势跟踪动量指标,用于分析股票或其他金融产品的价格趋势。MACD由两部分组成:差离值(DIF)和信号线(DEA)。DIF是短期(通常12天)指数移动平均线(EMA)与长期(通常26天)EMA的差值,再通过一个平滑期(通常9天)的E......
  • Day 30 | 122.买卖股票的最佳时机II、55. 跳跃游戏 、45.跳跃游戏II、 1005.K次取反后
    122.买卖股票的最佳时机II本题解法很巧妙,本题大家可以先自己思考一下然后再看题解,会有惊喜!https://programmercarl.com/0122.买卖股票的最佳时机II.html给定一个数组,它的第i个元素是一支给定股票第i天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成......