一、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];
}
};