好难
考虑四个状态
持有;持续卖出;今日卖出;冷冻期视频讲解:
class Solution {
public int maxProfit(int[] prices) {
if(prices == null || prices.length == 0 || prices.length == 1) return 0;
int len = prices.length;
int[][] dp = new int[len][4];
dp[0][0] = -prices[0];//第0天持有
dp[0][1] = 0;//第0天持续卖出
dp[0][2] = 0;//第0天今日卖出
dp[0][3] = 0;//第0天冷冻期
for(int i = 1; i < len; i++) {
dp[i][0] = Math.max(dp[i-1][0], Math.max(dp[i-1][0] - prices[i], dp[i-1][3] - prices[i]));//第i天持有:前一天持有;今日买入:前一天持续不持有,前一天冷冻期
dp[i][1] = Math.max(dp[i-1][1], dp[i-1][3]);//第i天持续不持有:前一天持续不持有,前一天冷冻期
dp[i][2] = dp[i-1][0] + prices[i];//第i天今日卖出:前一天持有
dp[i][3] = dp[i-1][2];//第i天冷冻期:前一天今日卖出
}
return Math.max(Math.max(dp[len-1][1],dp[len-1][2]),dp[len-1][3]);
}
}
class Solution {
public int maxProfit(int[] prices) {
if(prices == null || prices.length == 0 || prices.length == 1) return 0;
int len = prices.length;
int[][] dp = new int[len][2];
dp[0][0] = 0;//第0天不持有
dp[0][1] = -prices[0];//第0天持有
dp[1][0] = Math.max(0, prices[1] - prices[0]);
dp[1][1] = Math.max(-prices[0], -prices[1]);
for(int i = 2; i < len; i++) {
dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] + prices[i]);//第i天不持有
dp[i][1] = Math.max(dp[i-1][1], dp[i-2][0] - prices[i]);//第i天持有,包括前一天的持有和今天的买入,因为有冷冻期,所以是前两天的不持有减去今天的价格
}
return dp[len-1][0];
}
}
class Solution {
public int maxProfit(int[] prices, int fee) {
if(prices == null || prices.length < 2) return 0;
int len = prices.length;
int[][] dp = new int[len][2];
dp[0][0] = 0;
dp[0][1] = -prices[0] - fee;
for(int i = 1; i < len; i++) {
dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] + prices[i]);
dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0] - prices[i] - fee);//减去交易费
}
return dp[len-1][0];
}
}
之后总结