地址:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/
思路:贪心 || DP
思路一、贪心:利用贪心思路,当出现峰值(买卖间有正差值)时即将股票卖掉,同时寻找下一个峰值。对于卖出时需要手续费fee,其峰值相当于卖出价格prices[i]-fee,记录当前最小值Min,当prices[i]-fee>Min时,则答案加上其差值res+=prices[i]-fee-Min;同时令 Min = prices[i]-fee即可。
思路二、DP:
dp[n][0]表示到第n天没有买入股票的最大利润
dp[n][1]表示到第n天有买入股票的最大利润
dp[i][0]=max(dp[i-1][0],dp[i-1][1]+prices[i]-fee);
dp[i][1]=max(dp[i-1][1],dp[i-1][0]-prices[i]);
Code 1.贪心:
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int res=0,Min=prices[0];
for(int i=1;i<prices.size();++i)
if(prices[i]-fee>Min){
res+=prices[i]-fee-Min;
Min=prices[i]-fee;
}else if(prices[i]<Min){
Min=prices[i];
}
return res;
}
};
Code 2.DP:
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int n=prices.size(),dp[n][2];
dp[0][0]=0; dp[0][1]=-prices[0];
for(int i=1;i<n;++i)
{
dp[i][0]=max(dp[i-1][0],dp[i-1][1]+prices[i]-fee);
dp[i][1]=max(dp[i-1][1],dp[i-1][0]-prices[i]);
}
return dp[n-1][0];
}
};