这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战」。
309. 最佳买卖股票时机含冷冻期
题目描述
给定一个整数数组prices,其中第 **prices[i] 表示第 i 天的股票价格 。
设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
- 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入: prices = [1,2,3,0,2]
输出: 3
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]
示例 2:
输入: prices = [1]
输出: 0
解析
/**
* @brief 动态规划
* 今天的状态分析:
* 持有股票状态:
* (0)、今天才买入
* (1)、昨天已经持有股票
* 卖出股票状态:
* (2)、今天卖出
* (3)、前天卖出,昨天是冷冻期
* 冷却状态:
* (4)、昨天卖出股票,今天为冷冻期
*
*
* 1、确定dp数组以及下标的含义
* dp[i][j] : 表示当前状态下,手中的金额。
* 2、确定递推式
* 根据与状态
* 买入股票状态:dp[i][0]
* 昨天就持有:dp[i][0] = dp[i-1][0]
* 今天买入:
* 昨天是冷冻期:dp[i-1][3] - prices[i]
* 昨天保持卖出状态:dp[i-1][1] - prices[i]
* 取最大值: max(dp[i-1][3],dp[i-1][1] - prices[i])
*
* 保持卖出股票状态:dp[i][1]
* 昨天就是卖出状态
* 昨天是冷冻期
* dp[i][1] = max(dp[i-1][1],dp[i-1][3]);
* 今天是卖出状态:dp[i][2]
* 刚卖出状态:
* 昨天买入状态,今天卖出: dp[i][2] = dp[i-1][0] + prices[i]
* 冷冻期状态:dp[i][3]
* 昨天卖出股票:dp[i][3] = dp[i-1][2]
* 综上:
* dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][3], 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];
*
* 3、初始化dp数组
* 持有股票状态: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)
{
int len = prices.size();
if (len == 0)
{
return 0;
}
// 定义dp数组
vector<vector<int>> dp(len, vector<int>(4, 0));
// 初始化dp[0][0],持有股票
dp[0][0] -= prices[0];
for (int i = 1; i < len; i++)
{
// 递推公式
dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][3], 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[len - 1][3], max(dp[len - 1][1], dp[len - 1][2]));
}
};