要求:含手续费
思路:
法一:动规,题目意思是卖出时才扣手续费。还可以更简化为两种状态持股和不持股
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int n=prices.size();
vector<vector<int>> dp(n,vector<int>(4,0));
dp[0][0]=dp[0][1]=-prices[0];
for(int i=1;i<n;++i){
dp[i][0]=max(dp[i-1][2],dp[i-1][3])-prices[i];//买等于昨天卖或者空仓
dp[i][1]=max(dp[i-1][1],dp[i-1][0]);//持有等于昨天持有或者买
dp[i][2]=max(dp[i-1][1],dp[i-1][0])+prices[i]-fee;//卖等于昨天持有或者买
dp[i][3]=max(dp[i-1][2],dp[i-1][3]);//空仓等于昨天空仓或者卖
}
return max(dp[n-1][2],dp[n-1][3]);
}
};
法二:贪心,低买高卖并不对,因为次数多手续费也高。所以正确做波段应该是卖出买入前比较买点+手续费和当前卖出价看划不划算。
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int n=prices.size();
int low=prices[0];
int profit=0;
int buy=prices[0]+fee;
for(int i=1;i<n;++i){
if(prices[i]+fee<buy)buy=prices[i]+fee;//卖点合理重新买入
else if(prices[i]>buy){
profit+=prices[i]-buy;
buy=prices[i];//算完利润后更新卖点价格
}
}
return profit;
}
};