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

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

Code

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
class Solution {
public:
int maxProfit(vector<int>& prices) {
// 动态规划 本题与买卖股票的最佳时机II 唯一的区是本题只能买卖两次
// 且同时只能持有一支股票 递推公式 dp[i][0]
// 第i天第一次持有股票所得现金(选择最低的持有) dp[i][1]
// 第i天第一次卖出股票所得现金 dp[i][2]
// 第i天第二次卖出股票所得现金(选择最低的持有) dp[i][3]
// 第i天第二次卖出股票所得现金
vector<vector<int>> dp(prices.size(), vector<int>(5, 0));
// 初始化 dp[0][0] -= prices[0];dp[0][1] = 0;dp[0][2] -= prices[0];
// dp[0][3] = 0;
dp[0][1] -= prices[0];dp[0][3] -= prices[0];
for (int i = 1; i < prices.size(); i++) {
// 第一次买入
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
// 第一次卖出: 第一次持有+当前股价
dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] + prices[i]);
// 第二次持有需要卖出第一次
dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]);
// 第二次卖出: 第二次持有+当前股价
dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]);
}
return dp[prices.size()-1][4];
}
};