代码随想录算法训练营第三十八天| 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV

发布时间 2023-07-26 09:34:02作者: 博二爷

 123.买卖股票的最佳时机III

要求:最多买卖两次股票,获得最大利润

思路:

分成四个状态

第一次买 卖, 第二次买 卖

代码 :

 1 // 最多只能进行一笔交易
 2 // 难点:
 3 //    1,只能买卖两次
 4 //    2,中间可能有空隙:一直不持有
 5 // 
 6 // 持有:dp[i][0] 不持有:dp[i][1]
 7 // 
 8 // 持有:
 9 //    一直持有 dp[i-1][0]
10 //    刚持有(如何保证只能买卖两次)dp[i-1][1]-prices[i] -》能否设置单次买卖的场景,然后选择其中最大的两次?
11 // 
12 // 不持有
13 //    dp[i-1][1]
14 //    dp[i-1][0]+prices[i]
15 // 
16 // 如果强制选择前两次,可能一次里面包含着另一次
17 // 
18 // 分成四种情况: 第一次买 卖 第二次买 卖
19 // dp[i][0] [1] [2] [3]
20 //
21 int maxProfit(vector<int>& prices) {
22     if (prices.size() == 1) return 0;
23     vector<vector<int>> dp(prices.size(), vector<int>(4, 0));
24 
25     dp[0][0] = -prices[0];
26     dp[0][1] = 0;
27     dp[0][2] = -prices[0];
28     dp[0][3] = 0;
29 
30     for (int i = 1; i < prices.size(); i++)
31     {
32         dp[i][0] = max(dp[i - 1][0], -prices[i]);
33         dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);
34         dp[i][2] = max(dp[i - 1][2], -prices[i] + dp[i - 1][1]);
35         dp[i][3] = max(dp[i - 1][3], prices[i] + dp[i - 1][2]);
36     }
37 
38     return dp[prices.size() - 1][3];
39 }