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]);
}
};