309.最佳买卖股票时机含冷冻期
本题加了一个冷冻期,状态就多了,有点难度,大家要把各个状态分清,思路才能清晰
class Solution {
public int maxProfit(int[] prices) {
// 状态一:达到持有股票状态(今天买入股票;或者是之前就买入了股票没有操作,一直持有)
// 不持有股票状态,这里就有两种卖出股票状态
// 状态二:保持卖出股票的状态(两天前就卖出了股票,度过一天冷冻期;或者是前一天就是卖出股票状态,一直没操作)
// 状态三:今天卖出股票
// 状态四:今天为冷冻期状态,但冷冻期状态不可持续,只有一天!
int daylen=prices.length;
int[][] dp=new int[daylen][4];
dp[0][0]=-prices[0];
for(int i=1;i<daylen;i++){
//持有股票 (分析空的情况(因为空才需要买))前一天是冷冻期证明刚买过今天可以买;前一天不是冷冻期(因为至少分出两个状态是冷冻期和不是冷冻期,但是前一天也不可以是卖出状态,因为第二天肯定是冷冻期,于是这个状态可以理解为已经过了冷冻期但是一直没有买入)但是没有股票于是今天也可以买
dp[i][0]=Math.max(dp[i-1][0],Math.max(dp[i-1][3]-prices[i],dp[i-1][1]-prices[i]));
//不是冷冻期但是也没有股票的状态可以由:本身状态保持得来,也可以由前一天是冷冻期得来,但是不会是从持有股票变成不持有股票,因为
dp[i][1]=Math.max(dp[i-1][1],dp[i-1][3]);
dp[i][2]=dp[i-1][0]+prices[i];
//冷冻状态一定由前一天是卖出状态才能得来
dp[i][3]=dp[i-1][2];
}
return Math.max(dp[daylen-1][1],Math.max(dp[daylen-1][2],dp[daylen-1][3]));
}
}
714.买卖股票的最佳时机含手续费
相对122.买卖股票的最佳时机II ,本题只需要在计算卖出操作的时候减去手续费就可以了,代码几乎是一样的,可以尝试自己做一做。
class Solution {
public int maxProfit(int[] prices, int fee) {
int daylen=prices.length;
int[][] dp=new int[daylen][2];
dp[0][1]=-prices[0];
for(int i=1;i<daylen;i++){
//买入
dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]-prices[i]);
//卖出
dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]+prices[i]-fee);
}
return Math.max(dp[daylen-1][1],dp[daylen-1][0]);
}
}