1. 题目解析
题目链接:714. 买卖股票的最佳时机含手续费
这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。
2.算法原理
-
定义状态:
f[i]
表示第i
天结束后,持有股票时的最大利润。g[i]
表示第i
天结束后,不持有股票时的最大利润。
-
状态转移方程:
- 对于
f[i]
:- 如果第
i-1
天已经持有股票,则第i
天不操作,f[i] = f[i-1]
。 - 如果第
i-1
天没有股票,则第i
天买入股票,f[i] = g[i-1] - prices[i]
。
取两种情况的最大值,即f[i] = max(f[i-1], g[i-1] - prices[i])
。
- 如果第
- 对于
g[i]
:- 如果第
i-1
天持有股票,则第i
天卖出股票并支付手续费,g[i] = f[i-1] + prices[i] - fee
。 - 如果第
i-1
天没有股票,则第i
天不操作,g[i] = g[i-1]
。
取两种情况的最大值,即g[i] = max(g[i-1], f[i-1] + prices[i] - fee)
。
- 如果第
- 对于
-
初始化:
f[0] = -prices[0]
(第一天买入股票)。g[0] = 0
(第一天不持有股票,没有利润)。
-
填表顺序:从
i = 1
到i = n-1
依次计算f[i]
和g[i]
。 -
返回值:
g[n-1]
(最后一天不持有股票时的最大利润)。
3.代码编写
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int n = prices.size();
vector<int> f(n), 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];
}
};
The Last
嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。
觉得有点收获的话,不妨给我点个赞吧!
如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~