day55|● 309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费

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

1.代码

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int len = prices.size();
        vector<vector<int>>f(len, vector<int>(4, 0));
        f[0][0] = -prices[0];
        for (int i = 1; i < len; i++) {
            f[i][0] = max(f[i - 1][0], max(f[i - 1][1] - prices[i], f[i - 1][3] - prices[i]));//持有股票
            f[i][1] = max(f[i - 1][1], f[i - 1][3]);//已经过了冰冻期,股票早已卖出
            f[i][2] = f[i - 1][0] + prices[i]; //今天股票卖出,不持有股票的一种
            f[i][3] = f[i - 1][2];//冰冻期
        }
        return max(f[len - 1][1], max(f[len - 1][2], f[len - 1][3]));
    }
};

2.递归五部曲

题意:我们可以无限买股票,但是只能同时有一支股票,且 卖出股票的那天需要等冷冻期过了才能继续买股票,相当于买卖股票问题2的改良版

1.确定dp数组和其下标含义

我们一开始想肯定分为两个状态,持有股票和不持有股票,持有股票只有一种状态,但是不持有股票有冷冻期,卖股票的那一天,和冷冻期后,这些dp都是由不同状态推出来的,所以我们不能只写一个状态,我们写三个状态来表示

dp[i][0]代表第i天持有股票

dp[i][1]代表第i天在冷冻期后不持有股票

dp[i][2]表示第i天正好卖出股票

dp[i][3]代表处于冷冻期

2.确定递推公式

dp[i][0]

一.可以继承上一天持有股票的利润dp[i -1][0]

二.今天刚买股票,上一天是冷冻期,所以dp[i - 1][3] - prices[i]

三.过了冷冻期好几天,dp[i - 1][1] - prices[i]

dp[i][1]

一.前一天不是冰冻期,dp[i - 1][1] 

二.前一天是冰冻期,dp[i  - 1][3]

dp[i][2]

前一天持有股票,dp[i -1][0] + prices[i]

dp[i][3]

前一天卖股票,dp[i - 1][2]

状态都是用已知状态推导出来的

3.初始化dp数组

由dp数组推导公式可知,必须知道前一天的多有状态,所以初始化第一天就能推导出后面所有天,直到推导出结果,第一天只有持有股票有利润,-prices[0]

4.确定遍历顺序

从左到右依次推导出结果

5.打印数组


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

1.代码

class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) {
        int len = prices.size();
        vector<vector<int>>f(len, vector<int>(2, 0));
        f[0][0] = -prices[0];
        for (int i = 1; i < len; i++) {
            f[i][0] = max(f[i - 1][0], f[i - 1][1] - prices[i]);
            f[i][1] = max(f[i - 1][1], f[i - 1][0] + prices[i] - fee);
        }
        return f[len - 1][1];
    }
};

2.递归五部曲

题意:和买股票问题2差不多,但是这题需要卖出股票需要手续费,就是还有减去一些前,使利润减少一点

1.确定dp数组和其含义

两种:持有和不持有股票,依次是dp[i][0],dp[i][1]

2.递推公式

dp[i][0]

一.可以上一天继承,dp[i - 1][0]

二.今天刚买股票,因为可以买多次,所以继承上一天的利润是dp[i - 1][1] - prices[i]

dp[i][1]

一.继承上一天(上一天也不持有股票),dp[i - 1][1]

二.今天卖出了这支股票,需要减去手续费dp[i - 1][0] + prices[i]  - fee

后序与前面几题差不多

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值