website/content.en/ChapterFour/0700~0799/0714.Best-Time-to-Buy-and-Sell-Stock-with-Transaction-Fee.md
Your are given an array of integers prices, for which the i-th element is the price of a given stock on day i; and a non-negative integer fee representing a transaction fee.
You may complete as many transactions as you like, but you need to pay the transaction fee for each transaction. You may not buy more than 1 share of a stock at a time (ie. you must sell the stock share before you buy again.)
Return the maximum profit you can make.
Example 1:
Input: prices = [1, 3, 2, 8, 4, 9], fee = 2
Output: 8
Explanation: The maximum profit can be achieved by:
Buying at prices[0] = 1
Selling at prices[3] = 8
Buying at prices[4] = 4
Selling at prices[5] = 9
The total profit is ((8 - 1) - 2) + ((9 - 4) - 2) = 8.
Note:
0 < prices.length <= 50000.0 < prices[i] < 50000.0 <= fee < 50000.Given an integer array prices, where the i-th element represents the stock price on the i-th day; and a non-negative integer fee represents the transaction fee for trading the stock. You may complete an unlimited number of transactions, but you need to pay the fee for each transaction. If you have already bought a stock, you cannot buy again before selling it. Return the maximum profit you can obtain.
buy[i] represents the maximum profit from buying on day i, and sell[i] represents the maximum profit from selling on day i. The state transition equations are buy[i] = max(buy[i-1], sell[i-1]-prices[i]), sell[i] = max(sell[i-1], buy[i-1]+prices[i]-fee).
package leetcode
import (
"math"
)
// Solution 1 Simulated DP
func maxProfit714(prices []int, fee int) int {
if len(prices) <= 1 {
return 0
}
buy, sell := make([]int, len(prices)), make([]int, len(prices))
for i := range buy {
buy[i] = math.MinInt64
}
buy[0] = -prices[0]
for i := 1; i < len(prices); i++ {
buy[i] = max(buy[i-1], sell[i-1]-prices[i])
sell[i] = max(sell[i-1], buy[i-1]+prices[i]-fee)
}
return sell[len(sell)-1]
}
// Solution 2 DP with optimized auxiliary space
func maxProfit714_1(prices []int, fee int) int {
sell, buy := 0, -prices[0]
for i := 1; i < len(prices); i++ {
sell = max(sell, buy+prices[i]-fee)
buy = max(buy, sell-prices[i])
}
return sell
}