代码随想录算法训练营第五十一天|LeetCode309. 最佳买卖股票时机含冷冻期、LeetCode714. 买卖股票的最佳时机含手续费

文章介绍了两个使用动态规划解决的股票交易问题,包括含有冷冻期的309题和含有手续费的714题。在309题中,通过四个状态dp[i][0-3]来跟踪持有、卖出、保持卖出和冷冻期的状态,而714题则简化为两种状态dp[i][0-1]分别代表持有和不持有股票的状态。每种情况下,通过比较前一天的状态和当前价格来更新最大利润。
摘要由CSDN通过智能技术生成

一、LeetCode309. 最佳买卖股票时机含冷冻期

题目链接:309. 最佳买卖股票时机含冷冻期
我们给它设有四个状态,dp[i][0]:持有股票的状态,dp[i][1]:保持卖出股票的状态,dp[i][2]:卖出股票的状态,dp[i][3]:冷冻期。

递推公式:

//持有股票的状态由前一天持有股票的状态、冷冻期的状态及前一天卖出股票的状态推导而来
dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]));
//保持卖出股票的状态由前一天保持卖出股票的状态和冷冻期的状态推导而来
dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]); 
//卖出股票的状态由持有股票的状态加上当天股票的价格
dp[i][2] = dp[i - 1][0] + prices[i];
//冷冻奇的状态由前一天卖出股票的状态推到
dp[i][3] = dp[i - 1][2];

初始化:
dp[0][0] = -prices[0];
dp[0][1] = 0;
dp[0][2] = 0;
dp[0][3] = 0;

遍历顺序:从第一天开始,从小到大遍历每天股票的价格。

代码如下:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        vector<vector<int>>dp(prices.size(), vector<int>(4));
        dp[0][0] = -prices[0];//持有股票的状态
        dp[0][1] = 0;//保持卖出股票的状态
        dp[0][2] = 0;//卖出股票的状态
        dp[0][3] = 0;//冷冻期

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

        return max(dp[prices.size() - 1][1], max(dp[prices.size() - 1][2], dp[prices.size() - 1][3]));

    }
};

二、LeetCode714. 买卖股票的最佳时机含手续费

题目链接:714. 买卖股票的最佳时机含手续费
设置股票持有和不持有两种状态。
1、dp数组及下表含义:dp[i][0]表示第i天持有股票是的利润。dp[i][1]表示第i天不持有股票时的利润。
2、递推公式:
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee);
3、初始化:
dp[0][0] = -prices[0];
dp[0]1] = 0;
4、遍历顺序:
从下标一开始,从小到大遍历。
5、打印dp数组。
代码如下:

class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) {
        vector<vector<int>>dp(prices.size(), vector<int>(2));
        dp[0][0] =  -prices[0];//持有股票
        dp[0][1] = 0;//不持有股票

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

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值