代码随想录算法训练营第三十九天| 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费
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 }
714.买卖股票的最佳时机含手续费
代码:
1 // 要求,每次购买完,需要交手续费 2 // 3 int maxProfit(vector<int>& prices, int fee) { 4 if (prices.size() == 1) return 0; 5 6 vector<vector<int>> dp(prices.size(), vector<int>(2, 0)); 7 dp[0][0] = -prices[0]; 8 dp[0][1] = 0; 9 10 for (int i = 1; i < prices.size(); i++) 11 { 12 dp[i][0] = max(dp[i - 1][0], -prices[i] + dp[i - 1][1]); 13 dp[i][1] = max(dp[i - 1][1], prices[i] - fee + dp[i - 1][0]); 14 } 15 16 return max(dp[prices.size() - 1][0], dp[prices.size() - 1][1]); 17 }