给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。
设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入: prices = [1,2,3,0,2]
输出: 3
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]
示例 2:
输入: prices = [1]
输出: 0
- 先将情况分为两大类: 持有股票和没有持有股票
- 持有股票
- 昨天天就持有
- 今天刚买入
- 昨天已经过了冷冻期买入的
- 昨天是冷冻期买入的
- 没持有股票
- 今天刚卖出
- 昨天刚卖出,今天是冷冻期
- 比昨天更早卖出,今天已经不是冷冻期
综上有四种情况:
- 持有股票
- 今天刚迈出
- 今天是冷冻期
- 今天已经过了冷冻期
class Solution {
public int maxProfit(int[] prices) {
int len = prices.length;
int[][] dp = new int[len][4];
//持有股票:
dp[0][0] = -prices[0];
//没股票的三种情况:
//今天刚卖
dp[0][1] = 0;
//冷冻期
dp[0][2] = 0;
//过了冷冻期但没买入股票:前天或前天之前就卖掉了,但还没有再次买入股票
dp[0][3] = 0;
for(int i = 1; i < len; i++) {
//第i天持有股票: ①前一天就持有 ②今日买入:昨天不是冷冻期,今日买入的、昨天是冷冻期,今日买入的
dp[i][0] = Math.max(dp[i - 1][0], Math.max(dp[i - 1][3] - prices[i], dp[i - 1][2] - prices[i]));
//第i天刚卖 那只能是前一天持有,今天卖出
dp[i][1] = dp[i - 1][0] + prices[i];
//第i天是冷冻期 则是第i - 1天刚卖出
dp[i][2] = dp[i - 1][1];
//第i天过了冷冻期但还没有买入股票 ①第i - 1 天是冷冻期 ②第i - 1天也过了冷冻期
dp[i][3] = Math.max(dp[i - 1][2], dp[i - 1][3]);
}
return Math.max(dp[len - 1][1], Math.max(dp[len - 1][2], dp[len - 1][3]));
}
}