初看贪心策略,乍看DP
i从0开始
记f[i][0]表示第i天不持有股票时的最大利润
f[i][1] 表示第 i 天持有股票时的最大利润
f[i][2] 表示第 i 天处于冷冻期时的最大利润
注意是利润
初始化
f[0][0] 初始化为 0,因为第一天不持有股票时利润为 0。
f[0][1] 初始化为 -stocks[0],因为第一天买入股票时利润为负的股票价格。
f[0][2] 初始化为 0,因为第一天不可能处于冷冻期。
状态转移
/*
f[i][0]: 第 i 天不持有股票的状态可以从前一天不持有股票
或前一天处于冷冻期转移过来。
f[i][1]: 第 i 天持有股票的状态可以从前一天持有股票
或前一天不持有股票并买入股票转移过来。
为什么是减stocks[i]因为f存储的是利润,买了股票就应该先减去本金
f[i][2]: 第 i 天处于冷冻期的状态只能从前一天持有股票
并卖出股票转移过来。
+stocks[i]将这一天的股票进行出售就是加上卖出的钱
答案就在f[n - 1][0], f[n - 1][2](下标从0开始)
*/
f[i][0] = Math.max(f[i - 1][0], f[i - 1][2]);
f[i][1] = Math.max(f[i - 1][1], f[i - 1][0] - stocks[i]);
f[i][2] = f[i - 1][1] + stocks[i];
public static int solution(int[] stocks) {
int n = stocks.length;
int[][] f = new int[n][3];
f[0][1] = -stocks[0];
for (int i = 1; i < n; i++) {
f[i][0] = Math.max(f[i - 1][0], f[i - 1][2]);
f[i][1] = Math.max(f[i - 1][1], f[i - 1][0] - stocks[i]);
f[i][2] = f[i - 1][1] + stocks[i];
}
return Math.max(f[n - 1][0], f[n - 1][2]);
}