代码随想录
309.最佳买卖股票时机含冷冻期
思路
思路:
分为4个状态(将卖出作为一个暂态,其他的持有和买入作为一个长久状态)
0-买入状态,前一天就是买入,或者在卖出or冷冻的基础上买入
1-不持有股票状态,前一天就不持有or前一天是冷冻期
2-今天卖出股票
3-冷冻期
dp[i][j]表示第i天在第j个状态的最大利润
dp[0][0]=-prices[0]
dp[0][1]=0
dp[0][2]=0
dp[0][3]=0
状态0从两种情况取最大:前一天就是买入,或者在卖出or冷冻的基础上买入dp[i][0]=max(dp[i-1][0],max(dp[i-1][3]-prices[i], dp[i-1][1]-prices[i]))
状态1从两种情况取最大:前一天就持有股票,当天买入
dp[i][1]=max(dp[i-1][1],dp[i-1][3])
状态2:当天售出
dp[i][2]=dp[i-1][0]+prices[i]
状态3:冷冻期
dp[i][3]=dp[i-1][2]
代码
class Solution {
public int maxProfit(int[] prices) {
int dp[][] = new int[prices.length][4];
dp[0][0]=-prices[0];
dp[0][1]=0;
dp[0][2]=0;
dp[0][3]=0;
for(int i = 1;i<prices.length;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[prices.length-1][1],Math.max(dp[prices.length-1][2],dp[prices.length-1][3]));
}
}
714.买卖股票的最佳时机含手续费
思路
思路:关键是在卖出股票的时候减去手续费。
分为2个状态
0-持有股票状态,两种情况取最大:前一天就持有,当天买入
1-不持有股票状态,两种情况取最大:前一天就不持有,当天卖出
dp[i][j]表示第i天在状态j的最大利润
初始化
dp[0][0]=-prices[0];
dp[0][1]=0;
递推公式:
dp[i][0]=max(dp[i-1][0],dp[i-1][1]-prices[i])
dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i]-fee);
代码
class Solution {
public int maxProfit(int[] prices, int fee) {
int dp[][] = new int[prices.length][2];
dp[0][0]=-prices[0];
dp[0][1]=0;
for(int i = 1;i<prices.length;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[prices.length-1][1];
}
}