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;
    }

 

posted @ 2021-10-11 19:36  CharonKK  阅读(23)  评论(0)    收藏  举报