LeetCode 309 买卖股票的最佳时机含冷冻期
这一题需要设置四个状态,用于在买入时区分当天是冷冻期和当天可以正常卖出的情况。状态一是长期买入,状态二是包括当天在内两天没有卖出,也就是说当天是可以买入的了,状态三是前一天卖出,当天不能买入,状态四是前一天是冷冻期,当天可以正常买入。
状态推导上,第一个状态可以由第一个状态,第二个状态当天买入,第四个状态当天买入推导出来;第二个状态可以由第第四个状态和第二个状态推导而来;第三个状态可以由第一个状态卖出推导而来,注意是卖出不是买入了;第四个状态可以由第三个状态推导而来。
初始化时候将dp[0][0]初始化为-prices[0]即可
代码如下:
class Solution {
public int maxProfit(int[] prices) {
int[][] dp = new int[prices.length][4];
dp[0][0] = -prices[0];
for (int i = 1; i < prices.length; i++) {
dp[i][0] = Math.max(dp[i-1][3]-prices[i], Math.max(dp[i-1][1] -prices[i],dp[i-1][0]));
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]));
}
}
注意最后得出结果时还要取第二个、第三个、第四个状态的最大值
LeetCode 714 买卖股票的最佳时机含手续费
代码如下:
class Solution {
public int maxProfit(int[] prices, int fee) {
int[][] dp = new int[prices.length][2];
dp[0][0] = -prices[0]-fee;
for (int i = 1; i < prices.length; i++) {
dp[i][0] = Math.max(dp[i-1][1]-prices[i]-fee, dp[i-1][0]);
dp[i][1] = Math.max(dp[i-1][0] + prices[i], dp[i-1][1]);
}
return dp[prices.length-1][1];
}
}