「动态规划」买卖股票的最佳时机含手续费

力扣原题链接,点击跳转。

给定一个整数数组prices,其中pricesi表示第i天的股票价格,整数fee代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。这里的一笔交易指买入持有到卖出的整个过程,每笔交易你只需要支付一次手续费。如果你已经购买了一个股票,在卖出它之前你就不能再购买股票了。请计算你能获得的最大利润。

要分清楚状态和操作,我会用「」把状态和操作都标记出来。注意到,第i天结束后,手里有可能有股票,也就是处于「买入」状态;手里也有可能没有股票,也就是处于「卖出」状态。对于前者,接下来可以执行的操作有「持有股票」和「卖出股票」;对于后者,接下来可以执行的操作有「观望」和「买入股票」。在进行「买入股票」和「卖出股票」时会引起利润变化,前者减少利润,后者增加利润。「卖出股票」时,进行了一笔完整的交易,要缴纳手续费。

我们用动态规划的思想来解决这个问题。首先确定状态表示。我们用f表示处于「买入」状态,g表示处于「卖出」状态,i表示时间处于第i天结束时,表中的值表示最大利润。也就是说:

  • fi表示在第i天结束时,处于「买入」状态,此时能获得的最大利润。
  • gi表示在第i天结束时,处于「卖出」状态,此时能获得的最大利润。

接下来推导状态转移方程:

考虑fi。在第i天结束时处于「买入」状态,分类讨论:

  • 如果第i-1天结束时处于「买入」状态,并且在第i天「持有股票」,有fi=fi-1。
  • 如果第i-1天结束时处于「卖出」状态,并且在第i天「买入股票」,有fi=gi-1-pricesi。

考虑gi。在第i天结束时处于「卖出」状态,分类讨论:

  • 如果第i-1天结束时处于「卖出」状态,并且在第i天「观望」,有gi=gi-1。
  • 如果第i-1天结束时处于「买入」状态,并且在第i天「卖出股票」,有gi=fi-1+pricesi-fee。

综上,有:fi=max(fi-1,gi-1-pricesi),gi=max(gi-1,fi-1+pricesi-fee)。

接着考虑初始化的问题。

  • 对于f0,要在第0天结束时处于「买入」状态,就要在第0天「买入股票」,所以f0=-prices0。
  • 对于g0,要在第0天结束时处于「卖出」状态,就要在第0天「观望」,所以g0=0。

填表时应按照从左往右的顺序,同时填f表和g表。最后应返回gn-1,因为只有最后一天结束时处于「卖出」状态,才有可能获得最大利润。

cpp 复制代码
class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) {
        int n = prices.size();
        // 创建dp表
        vector<int> f(n);
        auto g = f;
        // 初始化g[0]=0
        f[0] = -prices[0];
        // 填表
        for (int i = 1; i < n; i++)
        {
            f[i] = max(f[i-1], g[i-1] - prices[i]);
            g[i] = max(g[i-1], f[i-1] + prices[i] - fee);
        }
        return g[n-1];
    }
};
相关推荐
坤坤子吖1 分钟前
算法学习——高精度加减乘除
c++·笔记·学习·算法
CQU_JIAKE9 分钟前
10.1[A]2267,磐久UMX【上下文128K,KVCache部分]
算法
朝朝辞暮i14 分钟前
C++ 第 14 课:引用 &
开发语言·c++·算法
Joe_Wang533 分钟前
【从0到1学习JVM · 21】既不浪费空间又没有碎片,标记整理算法到底慢在哪
jvm·学习·算法·垃圾回收·标记整理算法
让学习成为一种生活方式39 分钟前
PlantCellChat--单细胞与空间转录组数据预测植物细胞间通讯的R包--The Plant Journal
算法
C++ 老炮儿的技术栈1 小时前
有符号变量与无符号变量的区别
服务器·开发语言·前端·数据结构·c++·算法·c
梦帮科技1 小时前
多任务权重流形融合:SLERP 球形线性插值、DARE 稀疏剪枝与多专家模型融合落地
人工智能·深度学习·算法·机器学习·tensorflow·聚类·剪枝
Tisfy1 小时前
LeetCode 0020.有效的括号:栈匹配
算法·leetcode·字符串·题解·括号匹配
测试学习test1 小时前
SPI读取W25Q64硬件驱动(HAL库)
数据库·stm32·嵌入式硬件·算法
迅猛龙办公室2 小时前
Python实现斐波那契数列
算法