题目链接
买卖股票的最佳时机含手续费
题目描述

注意点
- 1 <= prices.length <= 50000
- 可以无限次地完成交易,但是你每笔交易都需要付手续费
解答思路
- 可以使用动态规划解决本题,在任意一天,只会有两种状态:持有股票和未持有股票,其中未持有股票可能是当天卖出,也可能是之前卖出或者没有买入;持有股票可能是当天买入,也可能是之前买入。dp[i][0]表示第i天未持有股票,dp[i][0] = Math.max(dp[i - 1][1] + prices[i] - fee, dp[i - 1][0]);dp[i][1]表示第i天持有股票,dp[i][1] = Math.max(dp[i - 1][0] - prices[i], dp[i - 1][1])
代码
class Solution {
public int maxProfit(int[] prices, int fee) {
int n = prices.length;
int[][] dp = new int[n][2];
dp[0][0] = 0;
dp[0][1] = -prices[0];
for (int i = 1; i < n; i++) {
dp[i][0] = Math.max(prices[i] - fee + dp[i - 1][1], dp[i - 1][0]);
dp[i][1] = Math.max(dp[i - 1][0] - prices[i], dp[i - 1][1]);
}
return dp[n - 1][0];
}
}
关键点
- 动态规划的思想
- 注意当天买入的情况中,除了减去当天买入所需的花费外,还要加上前一天未持有股票的最大利润(之前卖出股票的利润)