714. Best Time to Buy and Sell Stock with Transaction Fee
You are given an array prices where prices[i] is the price of a given stock on the ith day, and an integer fee representing a transaction fee.
Find the maximum profit you can achieve. You may complete as many transactions as you like, but you need to pay the transaction fee for each transaction.
Note: You may not engage in multiple transactions simultaneously (i.e., you must sell the stock before you buy again).
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.
Example 2:
Input: prices = [1,3,7,5,10,3], fee = 3
Output: 6
solution
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int hold = INT_MIN+fee, not_hold = 0;
for(int i=0; i<prices.size(); i++){
int prehold = hold;
hold = max(hold, not_hold - prices[i]);
not_hold = max(not_hold, prehold + prices[i] - fee);
}
return not_hold;
}
};
NOTE
this problem can be easily solved using DP transition equation
we know that we only have two states
- hold
- not hold
so we can come up the state transition equations
h
o
l
d
=
m
a
x
(
h
o
l
d
,
n
o
t
h
o
l
d
−
p
r
e
i
c
e
s
[
i
]
)
hold = max(hold, not \ hold-preices[i])
hold=max(hold,not hold−preices[i])
n
o
t
h
o
l
d
=
m
a
x
(
n
o
t
h
o
l
d
,
h
o
l
d
+
p
r
e
i
c
e
s
[
i
]
−
f
e
e
)
not\ hold = max(not\ hold, hold+preices[i]-fee)
not hold=max(not hold,hold+preices[i]−fee)
and then we can write code
Be careful to wirte
int hold = INT_MIN+fee
, cause we don’t wantprehold + prices[i] - fee
overflow