LeetCode T309 买卖股票的最佳时机含冷冻期
题目链接:309. 买卖股票的最佳时机含冷冻期 - 力扣(LeetCode)
题目思路:
这题其实就是将卖出的状态拆分成三个状态
1.前两天就卖出并一直保持卖出的状态
2.今天卖出的状态
3.今天是冷冻期的状态
当然还有一个持有的状态
下面我们用动规五部曲来分析
1.确定dp数组含义
dp[i][j]同样表示第i天在第j个状态的最大钱数
2.确定递推公式
//持有状态
要么是之前就是持有状态的延续,要么就是冷冻期结束买入,要么就是卖出状态买入,三者取最大值即可
dp[i][0]
//卖出持续状态
维持前面的卖出状态或者是冷冻期结束维持卖出状态
dp[i][1]
//当天卖出状态 就是持有状态加上卖出的价值
dp[i][2]
//冷冻期 取决于卖出的状态
dp[i][3]
3.初始化dp数组
dp[0][0]初始化为-prices[0]
例如今天买入股票、今天卖出股票、今天是冷冻期,都是不能操作股票的。
所以其他的状态都是不合法的,初始化为0
4.确定遍历顺序
顺序遍历,因为后面的数据由前面产生
5.打印dp数组排错
题目代码:
class Solution {
public int maxProfit(int[] prices) {
if(prices.length<=1){
return 0;
}
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][3],Math.max(dp[prices.length-1][1],dp[prices.length-1][2]));
}
}
LeetCode T714 买卖股票的最佳时机含手续费
题目链接:714. 买卖股票的最佳时机含手续费 - 力扣(LeetCode)
题目思路:
这一题我不用动规五部曲去分析了,因为这一题和之前买卖股票的最佳时机II的唯一区别就是在卖出股票的时候多收了一个手续费,我们在卖出的时候减去这个手续费即可,思路简单,我们直接给出代码.
题目代码:
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];
}
}