动态规划-简单多状态dp问题——714.买卖股票的最佳时机含手续费

1.题目解析

题目来源:714.买卖股票的最佳时机含手续费------力扣

测试用例

2.算法原理

1.状态表示

本题有两种状态,一种是卖出状态一种是买入状态

我们创建两个dp表来分别存储这两种状态,f\[\]表示买入,g\[\]表示卖出

fi表示第i个位置处于买入状态时的最大利润,gi表示第i个位置处于卖出状态的最大利润

2.状态转移方程

买入与卖出两种状态是可以相互转换的,也就是题目中说的可以随意买卖,但是有手续费

此时如果要求第i个位置的最大利润需要对两种状态分类讨论

a.第i个位置处于买入状态:此时第i-1个位置可以是买入也可以是卖出,如果是买入则直接取第i-1个位置的利润即可,如果是卖出则需要减去第i个位置的股票价格,由于手续费在买卖时只需要付一次,因此我们可以在卖出时再付手续费

b.第i个位置处于卖出状态:此时第i-1个位置可以是买入也可以是卖出,如果是买入说明此时第i个位置就是交易位置,此时加上该位置的股票售价并付手续费,如果是卖出则直接取第i-1个位置的利润即可

3.初始化

每个位置都需要前一个位置计算,因此需要初始化两个dp表的第一个位置,f的第一个位置代表买入,则等于-prices0,g的第一个位置代表卖出,此时没有买卖股票则为0

4.填表顺序

从左到右,两个表一起填

5.返回值

由于最后手中持有股票一定无法获得最大利润,因此只需要返回最后一个位置卖出状态的利润即可

3.实战代码

cpp 复制代码
class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) 
    {
        int n = prices.size();
        vector<int> f(n);
        vector<int> g(n);
        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];
    }
};
相关推荐
Zootopia62615 分钟前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
longlongzihan21 分钟前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划
2601_960356381 小时前
2027校招采购岗解析:数学基础如何迁移到需求预测、成本与供应商分析
人工智能·算法
h_a_o777oah2 小时前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO92 小时前
指针的算术运算详解
java·数据结构·算法
sunshine22 girl2 小时前
Java学习六 Java常见API-2--String-3-字符串的截取替换和其他方法
java·开发语言·学习
Coder-magician2 小时前
《代码随想录》刷题打卡day47:并查集-part01
数据结构·算法·图论
垆边人似月.2 小时前
VLAN 资源池(100~200 分档)
数据结构·算法
sunshine22 girl3 小时前
Java学习六 Java常见API-1-Radom随机数
java·开发语言·学习
潼心1412o3 小时前
C++初阶(长期更新)第6讲:类和对象(下)
开发语言·c++·算法