LeetCode Day51 714

203 阅读1分钟
714. 买卖股票的最佳时机含手续费

dp数组含义:dp[i][0] 表示第i天持有股票所省最多现金。 dp[i][1] 表示第i天不持有股票所得最多现金。而这题和买卖股票那题最大的区别就是这里需要减去一个手续费。

class Solution {
    public int maxProfit(int[] prices, int fee) {
        int len = prices.length;
        int[][] dp = new int[len][2];
        //考虑买入时支付手续费
        dp[0][0] = -prices[0] - fee;
        for(int i = 1; i < len; 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][0] + prices[i], dp[i-1][1]);
        }
        return Math.max(dp[len-1][0], dp[len-1][1]);
    }
}
股票问题总结
  • LC121:股票只能买卖一次,求最大利润。贪心解法是取最左最小值,取最右最大值,那么得到的差值就是最大利润。dp解法就是分别用dp[i][0]和dp[i][1]表示第i天持有股票所得现金第i天不持有股票所得现金 两种状态。推导出来的动规方程是dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);
  • LC122:这里和LC121唯一不同的地方就是,121中股票全程只能买卖一次,所以如果买入股票,那么第i天持有股票即dp[i][0]一定就是 -prices[i]。但这一题股票可以买卖多次,因此第i天持股所持有的现金可能有之前买卖过的利润。