No714 Best Time to Buy and Sell Stock with Transaction Fee
714. 买卖股票的最佳时机含手续费 - 力扣(LeetCode) (leetcode-cn.com)
思路:动态规划的题,主要就是要找出状态方程
这里将每一天持股与否的最大利润作为状态, dp[i][0]和 dp[i][1]
- dp[i][0]表示第i天没有持股的最大利润,最大利润和前一天是否持股有关,第i-1天持股,那么股票就是在第i天卖出的,收入prices[i]
如果第i-1天没有持股,那么和i-1天的利润相同
- dp[i][1]表示第i天持股的最大利润, 同样和前一天是否持股有关, 第i-1天持股,那么和第i-1天的利润相同
如果第i-1天没有持股,股票是第i天买入的,花费 prices[i]+fee, dp[i][1]需要 用前一天的利润减去成本
public static int maxProfit(int[] prices, int fee) { int len = prices.length; if(len<2){ return 0; } int[][] dp = new int[len][2]; // dp[i][0] 表示当天不持股的最大利润, dp[i][1]表示当天持股的最大利润 //dp状态方程 dp[i][0] = max{dp[i-1][0], dp[i-1][1] + price[i] // dp[i][1] = max{dp[i-1][0]-fee-prices[i], dp[i-1][1]} int ans = Integer.MIN_VALUE; dp[0][0] = 0; dp[0][1] = -(fee+prices[0]); for(int i=1; i<len; i++){ dp[i][0] = Math.max(dp[i-1][0], (dp[i-1][1]+prices[i])); dp[i][1] = Math.max(dp[i-1][0]-fee-prices[i], dp[i-1][1]); int tmp = Math.max(dp[i][0], dp[i][1]); ans = Math.max(ans, tmp); } return ans; }

浙公网安备 33010602011771号