309.最佳买卖股票时机含冷冻期
文档讲解:代码随想录 (programmercarl.com)
视频讲解:动态规划来决定最佳时机,这次有冷冻期!| LeetCode:309.买卖股票的最佳时机含冷冻期_哔哩哔哩_bilibili
状态:dp定义看的文档,可以根据定义写完后面的。
思路
动规五部曲
-
确定dp数组以及下标的含义
dp[i][j]
,第i天状态为j,所剩的最多现金为dp[i][j]
。具体可以区分出如下四个状态:
- 状态一:持有股票状态(今天买入股票,或者是之前就买入了股票然后没有操作,一直持有)
- 不持有股票状态,这里就有两种卖出股票状态
- 状态二:保持卖出股票的状态(两天前就卖出了股票,度过一天冷冻期)
- 状态三:今天卖出股票
- 状态四:今天为冷冻期状态,但冷冻期状态不可持续,只有一天!
-
确定递推公式(直接根据下面这张图可以退出)
代码
class Solution { public:int maxProfit(vector<int>& prices) {vector<vector<int>> dp(prices.size(), vector<int>(4, 0));dp[0][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][0],max(dp[prices.size() - 1][1],max(dp[prices.size() - 1][2], dp[prices.size() - 1][3])));} };
714.买卖股票的最佳时机含手续费
文档讲解:代码随想录 (programmercarl.com)
视频讲解:动态规划来决定最佳时机,这次含手续费!| LeetCode:714.买卖股票的最佳时机含手续费_哔哩哔哩_bilibili
状态:能直接做出来。相对于动态规划:122.买卖股票的最佳时机II (opens new window),本题只需要在计算卖出操作的时候减去手续费就可以了,代码几乎是一样的。
代码
class Solution {
public:int maxProfit(vector<int>& prices, int fee) {vector<vector<int>> dp(prices.size(), vector<int>(2, 0));dp[0][0] = 0 - prices[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 max(dp[prices.size() - 1][0], dp[prices.size() - 1][1]);}
};