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
后序与前面几题差不多