• 代码随想录 -- day51 --309.最佳买卖股票时机含冷冻期 、714.买卖股票的最佳时机含手续费


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

    注意 冷冻期只为1天

    • 状态一:持有股票状态(今天买入股票,或者是之前就买入了股票然后没有操作,一直持有)
    • 不持有股票状态,这里就有两种卖出股票状态
      • 状态二:保持卖出股票的状态(两天前就卖出了股票,度过一天冷冻期。或者是前一天就是卖出股票状态,一直没操作)
      • 状态三:今天卖出股票
    • 状态四:今天为冷冻期状态,但冷冻期状态不可持续,只有一天!

    达到买入股票状态(状态一)即:dp[i][0],有两个具体操作:

    • 操作一:前一天就是持有股票状态(状态一),dp[i][0] = dp[i - 1][0]
    • 操作二:今天买入了,有两种情况
      • 前一天是冷冻期(状态四),dp[i - 1][3] - prices[i]
      • 前一天是保持卖出股票的状态(状态二),dp[i - 1][1] - prices[i]

    那么dp[i][0] = max(dp[i - 1][0], dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]);

    达到保持卖出股票状态(状态二)即:dp[i][1],有两个具体操作:

    • 操作一:前一天就是状态二
    • 操作二:前一天是冷冻期(状态四)

    dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]);

    达到今天就卖出股票状态(状态三),即:dp[i][2] ,只有一个操作:

    昨天一定是持有股票状态(状态一),今天卖出

    即:dp[i][2] = dp[i - 1][0] + prices[i];

    达到冷冻期状态(状态四),即:dp[i][3],只有一个操作:

    昨天卖出了股票(状态三)

    dp[i][3] = dp[i - 1][2];

    1. class Solution {
    2. public:
    3. int maxProfit(vector<int>& prices) {
    4. int n = prices.size();
    5. if (n == 0) return 0;
    6. vectorint>> dp(n, vector<int>(4, 0));
    7. dp[0][0] -= prices[0]; // 持股票
    8. for (int i = 1; i < n; i++) {
    9. dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]));
    10. dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]);
    11. dp[i][2] = dp[i - 1][0] + prices[i];
    12. dp[i][3] = dp[i - 1][2];
    13. }
    14. return max(dp[n - 1][3], max(dp[n - 1][1], dp[n - 1][2]));
    15. }
    16. };

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

    dp[i][0] 表示第i天持有股票所省最多现金。 dp[i][1] 表示第i天不持有股票所得最多现金

    如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来

    • 第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]
    • 第i天买入股票,所得现金就是昨天不持有股票的所得现金减去 今天的股票价格 即:dp[i - 1][1] - prices[i]

    所以:dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);

    在来看看如果第i天不持有股票即dp[i][1]的情况, 依然可以由两个状态推出来

    • 第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1][1]
    • 第i天卖出股票,所得现金就是按照今天股票价格卖出后所得现金,注意这里需要有手续费了即:dp[i - 1][0] + prices[i] - fee

    所以:dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee);

    1. class Solution {
    2. public:
    3. int maxProfit(vector<int>& prices, int fee) {
    4. int n = prices.size();
    5. vectorint>> dp(n, vector<int>(2, 0));
    6. dp[0][0] -= prices[0]; // 持股票
    7. for (int i = 1; i < n; i++) {
    8. dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
    9. dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee);
    10. }
    11. return max(dp[n - 1][0], dp[n - 1][1]);
    12. }
    13. };

  • 相关阅读:
    浅析Java设计模式【2.2】——适配器
    ubuntu部署k8s
    这个方法可以实现自动抠图,快来get
    Qt QCustomPlot介绍
    Linux:ssh免密登陆
    Mac文件搜索工具HoudahSpot 6.4.1中文版
    kotlin学习笔记记录
    通过free命令了解Linux系统内存状态
    【043】基于51单片机的篮球比赛积分计时系统Proteus仿真
    linux GPT格式分区丢失处理
  • 原文地址:https://blog.csdn.net/Accelerated/article/details/132941324