LeetCode: 309. 最佳买卖股票时机含冷冻期
类型题:
主要是定义状态, 和 含手续费类似, 手续费定义了两个状态 ( 持有股票, 不持有股票 )
本题定义三个状态 ( 持有股票, 不持有股票处于冷冻期, 不持有股票不处于冷冻期 )
d p [ l e n ] [ 3 ] dp[len][3] dp[len][3]
买入股票为负收益, 卖出获得正收益
然后就思考转移方程,怎么由(其他状态 | 上一状态) 转移过来即可。
AC Code
class Solution {
public int maxProfit(int[] prices) {
int len = prices.length;
if(len < 1) return 0;
int[][] dp = new int[len][3];
// 定义状态
// 0 表示持有股票, 1 不持有股票且冷冻期 2 不持有且不处于冷冻期
dp[0][0] = 0 - prices[0];
for(int i = 1; i < len; i++){
// 持有股票可以由上一个状态转移过来 or 买入股票, 买入就是负收益
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][2] - prices[i]);
// 买出?
dp[i][1] = Math.max(dp[i - 1][0] + prices[i], dp[i - 1][1]);
// dp[i][1] = dp[i - 1][0] + prices[i];
dp[i][2] = Math.max(dp[i - 1][1], dp[i - 1][2]);
}
return (int)Math.max(dp[len -1][1], dp[len -1][2]);
}
}