题目
leetcode 309.最佳买卖股票时机含冷冻期
重点
第i天卖出股票,则第i+1天不允许买股票。
此题和leetcode 714.买卖股票的最佳时机含手续费类似,但将手中无股票的状态进一步细分。
思路
动态规划
以下确定状态转移方程
定义
重点转移至股票卖出那一天,而非冷冻期。第i天能买股票取决于第i-1天是否卖出。
(1)手中有股票的情况
dp[i][0] 第i天交易完成时,手中有股票的情况下所获得的利益最大值
(2)手中没有股票的情况
dp[i][1] 在第i-1天手中本来就没有股票,使得第i天手中也没有股票的情况下,这是第i天无卖出交易行为所获利益最大值
dp[i][2]在第i-1天手中有股票,但在第i天卖出了股票的情况下,这是第i天有卖出交易行为所获利益最大值
理由及解释
(1)手中有股票的情况,第i天的利润来源的两种情况
i) 在第i-1天交易完成时,手中就有股票了,此时的利润为第i-1天有股票时的利润最大值
ii)在第i-1天时手中没有股票,但在第i天买了股票,所以现在手中有股票,此时的利润为第i-1天没有股票且无卖出情况的利润最大值 - 第i天股票的价格
(2)手中没有股票的情况
i)第i天无无卖出,第i天利润来源的两种情况
1:第i-1天手中本来就没有股票,第i天的利润为第i-1天无卖出的利润最大值
2:第i-1天手中本来有股票,但在第i-1天卖出,则第i天手中没有股票。因此第i-1天卖出的利润最大值
ii)第i天有卖出,则第i天的利润来源的情况
第i天手中本来有股票,但卖出了,则第i天的利润为第i-1天手中有股票的利润 + 第i天股票卖出的价格
状态转移方程
(1) 手中持股的情况
dp[i][0] = max(dp[i-1][0], dp[i-1][1] - prices[I]);
(2)手中不持股的情况
i)无卖出
dp[i][1] = max(dp[i-1][1], dp[i-1][2]);
ii) 有卖出
dp[i][2] = dp[i-1][0] + prices[I]
状态转移方程初始化
dp[0][0] = -prices[0]
dp[0][1] = 0
dp[0][2] = 0
AC代码
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
int dp[n][3];
//初始化
dp[0][0] = -prices[0];
dp[0][1] = 0;
dp[0][2] = 0;
for(int i = 1; i < n; 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][2]);//不持股,无卖出
dp[i][2] = dp[i - 1][0] + prices[i];//不持股,有卖出
}
return max(dp[n - 1][1], dp[n - 1][2]);
}
};