买卖股票的最佳时机III
学习记录自代码随想录
要点:1.需要想清楚每天有四种状态,持有第一支股票-不持有第一支股票-持有第二支股票-不持有第二支股票,从而明确出dp数组的定义;
2.递推公式想到对每个状态分别做递归,并且四个状态有时序关系,所以每个状态一定是和前一个状态有关联,如此寻找到递归关系表达式;
3.持有股票不一定就要当天买入股票,也有可能i-1天买入股票,两者取较大值递归;
4.不持有股票可以是i-1天就已经不持有股票,也可以是在当天卖出股票,同样取两者种较大值;
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
if(n == 1) return 0;
// 1.dp[i][0-3] 第i天是否持有股票有4种状态分别代表0持有第一支股票,1不持有第一支股票,2持有第二支股票,3不持有第二支股票
// dp[i][0-3] 第i天四种状态下各自最大利润
vector<vector<int>> dp(n, vector<int>(4, 0));
// 2.递推公式
// 3.dp数组初始化:dp[0][0], dp[0][2]
dp[0][0] = -prices[0]; // 第0天持有第一支股票,则初始化为-prices[0]此时没钱
dp[0][2] = -prices[0]; // 第0天持有第二支股票,买入卖出第一支后,再买如第二支,则同样初始化为-prices[0]
// 4.遍历顺序:正向遍历
for(int i = 1; i < n; i++){
// 递推公式很有规律
dp[i][0] = max(dp[i-1][0], -prices[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]);
}
// 5.举例推导dp数组
return dp[n-1][3];
}
};