Day50题目
LeetCode309买卖股票有冷冻期
核心思想:因为有冷冻期,和之前的题目的状态就有所不同,状态的确定是很难的
0 持有股票的状态 1 没有股票的状态 2 当天卖出股票 3 前一天卖出股票,今天就是冷冻期状态
class Solution {public int maxProfit(int[] prices) {// 四个状态, 0 保持持有股票的状态 , 1 保持卖出股票的状态, 2 卖出股票的动作 3 冷冻期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][1]-prices[i],dp[i-1][3] -prices[i]));// 不持有状态,之前就没有, 前一天买了(或者前一天是冷冻期),这里是dp[i-1][2]或者dp[i-1][3]都行dp[i][1] = Math.max(dp[i-1][1],dp[i-1][2]);// 卖出 只有在持有状态可以卖出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]));}
}
LeetCode714买卖股票有手续费
核心思想:在买卖股票Ⅱ的基础上加上手续费,只有两个状态,持有或者不持有
class Solution {public int maxProfit(int[] prices, int fee) {// 1 持有 0 不持有int[][] dp = new int[prices.length][2];dp[0][0] = 0;dp[0][1] = -prices[0];for(int i = 1; i < prices.length; i ++){dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1]+prices[i]-fee);dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0]-prices[i]);}// 有手续费的情况 最后卖出可能还没有不卖赚return Math.max(dp[prices.length-1][1], dp[prices.length-1][0]);}
}