时间轴

2025-12-17

init


题目:

状态转移,注意初始化不要用 INT_MIN,会导致后面计算溢出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <vector>
#include <algorithm>
using std::vector;

class Solution {
public:
int maxProfit(vector<int> &prices)
{
int i, n = prices.size();
int max_profit = 0;

if (n == 1) {
return 0;
}
// dp[i][j]表示到第i天第j个状态的最大利润
// dp[i][0]表示没有买入,dp[i][1]表示已经第一次买入,dp[i][2]表示第一次卖出
// dp[i][3]表示第二次买入,dp[i][4]表示第二次卖出
vector<vector<int> > dp(n, vector<int>(5, 0));
dp[0][0] = 0;
dp[0][1] = -prices[0];
dp[0][2] = -1e9;
dp[0][3] = -1e9;
dp[0][4] = -1e9;

// 每一天可以选择不买入,买入,或卖出(当且仅当已经买入过)
for (i = 1; i < n; i++) {
// 没有买入的前一个状态是没有买入
dp[i][0] = dp[i - 1][0];

// 第一次买入的前一个状态是没有买入,沿用昨天状态或买入今天股票
dp[i][1] = std::max(dp[i - 1][1], dp[i - 1][0] - prices[i]);

// 第一次卖出的前一个状态是第一次买入,沿用昨天状态或卖出今天股票
dp[i][2] = std::max(dp[i - 1][2], dp[i - 1][1] + prices[i]);

// 第二次买入的前一个状态是第一次卖出,沿用昨天状态或买入今天股票
dp[i][3] = std::max(dp[i - 1][3], dp[i - 1][2] - prices[i]);

// 第二次卖出的前一个状态是第二次买入,沿用昨天状态或卖出今天股票
dp[i][4] = std::max(dp[i - 1][4], dp[i - 1][3] + prices[i]);

max_profit = std::max({ dp[i][0], dp[i][2], dp[i][4], max_profit });
}
return max_profit;
}
};