代码随想录算法训练营第三十九天| 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费

发布时间 2023-07-27 10:17:30作者: 博二爷

309.最佳买卖股票时机含冷冻期 

要求:卖出之后有个一天的冷冻期,需要过了冷冻期才可以买

状态:

持有,卖 冷冻期,冷冻期后的不买

代码:

 1 // 要求:冷冻期一天,取得最大利润 
 2 // 注意:持有状态中不含冷冻期,卖了之后紧接着会有个冷冻期
 3 // 不持有里面包含着一个冷冻期,持有  卖 冷冻期 冷冻期后的不卖
 4 // 思路:分成三个状态:持有,不持有,如果不持有,选择的卖,那么就设置一个变量,让下一个无法买
 5 // 
 6 // 存在的问题:即使控制了买卖,但是并没有把冷冻期放到动态规划里,还是需要写一个公式,把冷冻期放进去
 7 // 
 8 // dp[i][0]  = dp[i-1][0] dp[i-1][2]-p dp[i-1][3]-p
 9 // 
10 // dp[i][1] = dp[i-1][0]+p
11 // 
12 // dp[i][2] = dp[i-1][1]
13 // 
14 // dp[i][3] = max(dp[i-1][3], dp[i-1][2]
15 //
16 int maxProfit(vector<int>& prices) {
17     if (prices.size() == 1) return 0;
18 
19     vector<vector<int>> dp(prices.size(), vector<int>(4, 0));
20     dp[0][0] = -prices[0];
21     dp[0][1] = 0;
22     dp[0][2] = 0;
23     dp[0][3] = 0;
24 
25     for (int i = 1; i < prices.size(); i++)
26     {
27         dp[i][0] = max(dp[i-1][0], max(dp[i - 1][2] - prices[i], dp[i-1][3] - prices[i]));
28 
29         dp[i][1] = dp[i-1][0] + prices[i];
30 
31         dp[i][2] = dp[i-1][1];
32         dp[i][3] = max(dp[i-1][3],dp[i - 1][2]);
33     }
34 
35     return max(max(dp[prices.size() - 1][0], dp[prices.size() - 1][1]),max( dp[prices.size() - 1][2], dp[prices.size() - 1][3]));
36 }