买卖股票的最佳时机(含手续费)
状态机 DP 经典题:在买入或卖出时扣手续费,核心仍是持股 / 不持股状态转移。
#algorithm
#snippet
#growing
#leetcode
#dp
[!info] related notes 动态规划 区间 DP 与状态机 DP 买卖股票的最佳时机
买卖股票的最佳时机(含手续费)
题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/
状态
hold:持股最大收益empty:不持股最大收益
转移
newEmpty = max(oldEmpty, oldHold + price - fee)
newHold = max(oldHold, oldEmpty - price)
手续费每笔完整交易只扣一次,本例在卖出时扣;允许多次交易但同时最多持有一股,不能把 LC121 的单次买入限制沿用到这里。
JavaScript
var maxProfit = function(prices, fee) {
if (prices.length === 0) return 0;
let hold = -prices[0];
let empty = 0;
for (let i = 1; i < prices.length; i++) {
const prevEmpty = empty;
empty = Math.max(empty, hold + prices[i] - fee);
hold = Math.max(hold, prevEmpty - prices[i]);
}
return empty;
};