力扣309.买卖股票的最佳时机含冷冻期
题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/
思路
例如[买,卖,冷冻期,不操作,不操作,买,卖]
1.dp数组的含义:
(1)dp[i][0]:持有状态
(2)dp[i][1]:保持卖出的状态,如例子中不操作就是保持卖出的状态
(3)dp[i][2]:具体卖出的状态,就是卖的那一天
(4)dp[i][3]:冷冻期
2.递推公式:
(1)dp[i][0]持有状态=max(前一天就持有,前一天保持卖出的状态并在今天买入,前一天是冷冻期并在今天买入)
(2)dp[i][1]保持卖出=max(前一天就是卖出状态,前一天是冷冻期)
(3)dp[i][2]具体卖出的状态=前一天持有
(4)dp[i][3]冷冻期=前一天是具体卖出的状态
3.初始化:
dp[0][0] = -prices[0];
dp[0][1] = 0;
dp[0][2] = 0;
dp[0][3] = 0;
需要注意在第一天时,状态1和3是非法状态,那就要在递推公式中推导两者的值。
4.遍历顺序:从前向后
5.打印数组:最后返回的是max(保持卖出状态,具体卖出状态,冷冻期)。不要忘了冷冻期也是可以的。
完整代码
class Solution {
public int maxProfit(int[] prices) {
int len = prices.length;
int[][] dp = new int[len][4];
dp[0][0] = -prices[0];
dp[0][1] = 0;
dp[0][2] = 0;
dp[0][3] = 0;
for (int i = 1; i < len; i++) {
dp[i][0] = dp[i-1][0] > dp[i-1][1]-prices[i] ? dp[i-1][0] : dp[i-1][1]-prices[i];
dp[i][0] = dp[i][0] > dp[i-1][3]-prices[i] ? dp[i][0] : dp[i-1][3]-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];
}
int max = dp[len-1][2] > dp[len-1][1] ? dp[len-1][2] : dp[len-1][1];
max = max > dp[len-1][3] ? max : dp[len-1][3];
return max;
}
}
力扣714.买卖股票的最佳时机含手续费
题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/
思路
本题和买卖股票的最佳时机2是一样的,只要在卖出股票的时候加上手续费即可。
完整代码
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];
}
}