day50

1.买卖股票的最佳时机含冷冻期

每次买完之后要等一天才能继续交易

相对于2,简单修改了状态转移方程 和 增加了base case2(根据最基础的状态转移方程推出来)

// 原始版本
int maxProfit_with_cool(int[] prices) {
    int n = prices.length;
    int[][] dp = new int[n][2];
    for (int i = 0; i < n; i++) {
        if (i - 1 == -1) {
            // base case 1
            dp[i][0] = 0;
            dp[i][1] = -prices[i];
            continue;
        }
        if (i - 2 == -1) {
            // base case 2
            dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] + prices[i]);
            // i - 2 小于 0 时根据状态转移方程推出对应 base case
            dp[i][1] = Math.max(dp[i-1][1], -prices[i]);
            //   dp[i][1] 
            // = max(dp[i-1][1], dp[-1][0] - prices[i])
            // = max(dp[i-1][1], 0 - prices[i])
            // = max(dp[i-1][1], -prices[i])
            continue;
        }
        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-2][0] - prices[i]);
    }
    return dp[n - 1][0];
}

// 空间复杂度优化版本
int maxProfit_with_cool(int[] prices) {
    int n = prices.length;
    int dp_i_0 = 0, dp_i_1 = Integer.MIN_VALUE;
    int dp_pre_0 = 0; // 代表 dp[i-2][0]
    for (int i = 0; i < n; i++) {
        int temp = dp_i_0;
        dp_i_0 = Math.max(dp_i_0, dp_i_1 + prices[i]);
        dp_i_1 = Math.max(dp_i_1, dp_pre_0 - prices[i]);
        dp_pre_0 = temp;
    }
    return dp_i_0;
}

2.买卖股票的最佳时机含手续费

注意base case都是由状态转移方程推出来的,转移方程改变后 base case 也要做出对应改变

// 原始版本
int maxProfit_with_fee(int[] prices, int fee) {
    int n = prices.length;
    int[][] dp = new int[n][2];
    for (int i = 0; i < n; i++) {
        if (i - 1 == -1) {
            // base case
            dp[i][0] = 0;
            dp[i][1] = -prices[i] - fee;
            //   dp[i][1]
            // = max(dp[i - 1][1], dp[i - 1][0] - prices[i] - fee)
            // = max(dp[-1][1], dp[-1][0] - prices[i] - fee)
            // = max(-inf, 0 - prices[i] - fee)
            // = -prices[i] - fee
            continue;
        }
        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[n - 1][0];
}

// 空间复杂度优化版本
int maxProfit_with_fee(int[] prices, int fee) {
    int n = prices.length;
    int dp_i_0 = 0, dp_i_1 = Integer.MIN_VALUE;
    for (int i = 0; i < n; i++) {
        int temp = dp_i_0;
        dp_i_0 = Math.max(dp_i_0, dp_i_1 + prices[i]);
        dp_i_1 = Math.max(dp_i_1, temp - prices[i] - fee);
    }
    return dp_i_0;
}

相关推荐

  1. day50

    2024-05-25 21:04:19       12 阅读
  2. 算法刷题 DAY50

    2024-05-25 21:04:19       34 阅读
  3. 【代码随想录】day50

    2024-05-25 21:04:19       10 阅读
  4. C++ day50 买卖股票最佳时机

    2024-05-25 21:04:19       41 阅读
  5. LeetCode 每日一题 Day 47 - 50

    2024-05-25 21:04:19       35 阅读
  6. LeetCode 每日一题 Day 51 - 53

    2024-05-25 21:04:19       34 阅读
  7. 算法刷题记录 Day50

    2024-05-25 21:04:19       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-25 21:04:19       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-25 21:04:19       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-25 21:04:19       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-25 21:04:19       20 阅读

热门阅读

  1. 一个程序员的牢狱生涯(35)惊疑

    2024-05-25 21:04:19       11 阅读
  2. vim方向键乱码

    2024-05-25 21:04:19       10 阅读
  3. C++常见知识点总结

    2024-05-25 21:04:19       8 阅读
  4. 美国服务器如何避免网络漏洞?

    2024-05-25 21:04:19       13 阅读
  5. leetcode119-Pascal‘s Triangle II

    2024-05-25 21:04:19       10 阅读
  6. 如何在Ubuntu上安装NVIDIA显卡驱动并禁止自动更新

    2024-05-25 21:04:19       11 阅读
  7. Android.mk变量解析

    2024-05-25 21:04:19       11 阅读