1.题目解析
题目来源:714.买卖股票的最佳时机含手续费——力扣
测试用例
2.算法原理
1.状态表示
本题有两种状态,一种是卖出状态一种是买入状态
我们创建两个dp表来分别存储这两种状态,f[]表示买入,g[]表示卖出
f[i]表示第i个位置处于买入状态时的最大利润,g[i]表示第i个位置处于卖出状态的最大利润
2.状态转移方程
买入与卖出两种状态是可以相互转换的,也就是题目中说的可以随意买卖,但是有手续费
此时如果要求第i个位置的最大利润需要对两种状态分类讨论
a.第i个位置处于买入状态:此时第i-1个位置可以是买入也可以是卖出,如果是买入则直接取第i-1个位置的利润即可,如果是卖出则需要减去第i个位置的股票价格,由于手续费在买卖时只需要付一次,因此我们可以在卖出时再付手续费
b.第i个位置处于卖出状态:此时第i-1个位置可以是买入也可以是卖出,如果是买入说明此时第i个位置就是交易位置,此时加上该位置的股票售价并付手续费,如果是卖出则直接取第i-1个位置的利润即可
3.初始化
每个位置都需要前一个位置计算,因此需要初始化两个dp表的第一个位置,f的第一个位置代表买入,则等于-prices[0],g的第一个位置代表卖出,此时没有买卖股票则为0
4.填表顺序
从左到右,两个表一起填
5.返回值
由于最后手中持有股票一定无法获得最大利润,因此只需要返回最后一个位置卖出状态的利润即可
3.实战代码
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];}
};