算法随想Day45【动态规划】| LC309-最佳买卖股票时机含冷冻期、LC714-买卖股票的最佳时机含手续费
LC309. 最佳买卖股票时机含冷冻期
更多的状态转移:
- dp[i] [0]含义:持有股票的最多现金
- 分两种情况,一是昨天就持有,即dp[i - 1] [0]。二是昨天没持有(可能是昨天抛出了,或者是昨天之前更早抛出了),所以今天若要买新的股票,则起码要用前天抛出股票时剩的现金来购买,即 dp[i - 1] [2] - prices[i]
- dp[i] [1]含义:今天抛出股票的最多现金
- dp[i] [2]含义:昨天或昨天之前抛出股票的最多现金,即数值等于昨天抛出股票剩的现金dp[i - 1] [1]
int maxProfit(vector<int>& prices)
{
int size = prices.size();
vector<vector<int>> dp(size, vector<int>(3, 0));
dp[0][0] = -prices[0];
dp[0][1] = 0;
dp[0][2] = 0;
for (int i = 1; i < size; ++i)
{
dp[i][0] = max(dp[i - 1][0], dp[i - 1][2] - prices[i]);
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
dp[i][2] = dp[i - 1][1];
}
return max(dp[size - 1][1], dp[size - 1][2]);
}
LC714. 买卖股票的最佳时机含手续费
- 含冷冻期,影响的是第 i 天购入时的现金(要用昨天之前剩的现金)
- 含手续费,影响的是第 i 天抛出时的收益,要减去手续费
所以在本题中不用使用多一个变量记录昨天之前的抛出股票的现金,只需在“买卖股票的最佳时机Ⅱ”的基础上,在抛出股票时,减多一个手续费。
int maxProfit(vector<int>& prices, int fee)
{
int size = prices.size();
vector<vector<int>> dp(size, vector<int>(2, 0));
dp[0][0] = -prices[0];
dp[0][1] = 0;
for (int i = 1; i < 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[size - 1][1];
}

浙公网安备 33010602011771号