题目:
our are given an array of integers prices, for which the
i
-th element is the price of a given stock on dayi
; 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
.
解释:
每次卖出的时候需要付出小费。同样一天可以同时卖出和买入,但是一定要线卖出再买入。
动态规划:
对于第i
天的收益,可能有两种情况:手中有stock
和手中没有stock
如果手中没有stock
,可能是今天刚卖出或者是保持前一天的状态 ,此时令收益为cash
。
如果手中有stock
,可能是今天刚买入或者是保持前一天的状态,此时令收益为hold
(收益有可能是负的)。
因为第i
天的状态仅和前一天的状态有关,所以只需要两个变量cash
和hold
(当然也可以用两个数组实现),
cash
表示手上没有stock
状态下的收益,hold
表示手上有stock
状态下的收益。
这里需要注意cash
和hold
的初始值,最终输出cash
,因为最后一天的情况一定是手里没有stock的。
可是为什么每天都保持max()??是因为最终要求最大利润吗?
python代码:
class Solution:
def maxProfit(self, prices, fee):
"""
:type prices: List[int]
:type fee: int
:rtype: int
"""
hold=-prices[0]
cash=0
for i in range(len(prices)):
"""
手中没有stock,今天卖出(先前有的状态+今天的价格-小费)
或者保持昨天没有的状态
"""
cash=max(cash,hold+prices[i]-fee)
"""
手中有stock,今天买入(可能是今天先卖了再买入,也可能进入今天的
时候手上就没有stock,直接买入)(先前没有的状态-今天的价格)或者
保持昨天有的状态
"""
hold=max(hold,cash-prices[i])
return cash
c++代码:
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int hold=-prices[0];
int cash=0;
for (int i=0;i<prices.size();i++)
{
cash=max(cash,hold+prices[i]-fee);
hold=max(hold,cash-prices[i]);
}
return cash;
}
};
改成两个数组做,或许更好理解:
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int n = prices.size() ;
if( n <= 1 )
return 0 ;
vector<int> buy(n,0);
vector<int> sell(n,0);
buy[0] = - prices[0];
for( int i= 1 ; i<prices.size() ; i++){
sell[i] = max( buy[i-1] + prices[i] - fee , sell[i-1] ) ;
buy[i] = max( sell[i] - prices[i] , buy[i-1] ) ;
}
return sell[n-1];
}
};
总结:
买股票系列的题目都停迷醉的。