买卖股票的最佳时机 (含手续费)

image

导读 ^ _ ^

买股票的系列问题五!
这次股票的限制是操作含有手续费。
讲完这道股票系列就完结啦!

题目

leetcode 714
image.png

代码与思路

确定状态

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

转移方程

dp[i][0], 那么可以由两个状态推出来

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

dp[i][1]的情况, 依然可以由两个状态推出来

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

遍历答案

//买卖股票最佳时机(含手续费)


class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) {
        int n = prices.size();
        vector<vector<int>> dp(n, vector<int>(2, 0));
        dp[0][0] -= prices[0]; // 持股票
        for (int i = 1; i < n; i++) {
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee);
        }
        return max(dp[n - 1][0], dp[n - 1][1]);
    }
};

#谢谢你的观看!

^ _ ^

posted @ 2023-01-18 13:55  阿新的杂记  阅读(27)  评论(0编辑  收藏  举报