算法分析
题目介绍
一天股票有一个价格,用一个数组prices[]来表示,每天
你都可以买一个股票或者卖一个股票,但是卖一个股票要
你价格为fee的手续费,求你最后赚的最多。有一个限制
(你只能买一支股票,必须卖了这支才能买其他的)。
输入输出
输入: prices = [1, 3, 2, 8, 4, 9], fee = 2
输出: 8
解释: 能够达到的最大利润:
在此处买入 prices[0] = 1
在此处卖出 prices[3] = 8
在此处买入 prices[4] = 4
在此处卖出 prices[5] = 9
总利润: ((8 - 1) - 2) + ((9 - 4) - 2) = 8.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
动态规划分析
这里很难用贪心法来做,因为有一个手续费fee,不能直接贪心每次
都买最小的,同时卖后面比他小的最大的,这个先不讨论,因为我相
信明天的LeetCode签到题就是没有手续费的,也就是122题。
使用动态规划来写,因为它无后续性,后面买卖与前面最大利润有
关,使用一个db1[]代表这天手里没货的最大利润,db2[]代表手里有
货的最大利润。
转移方程就是
db1[i]=max(db1[i-1],db2[i-1]-price[i])//第二个代表买了
db2[i]=max(db2[i-1],db1[i-1]+price[i]-fee)//第二个代表卖了
还有一点需要注意,一开始的时候需要db1[0]代表一开始
就买,所有是负债的。
代码
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
if(prices.size()<2)
{
return 0;
}
int *db1=new int[prices.size()];//第i天手里有股票
int *db2=new int[prices.size()];//第i天手里没有股票
memset(db1,0,prices.size());
memset(db2,0,prices.size());
db1[0]=0-prices[0];
for(int i=1;i<prices.size();i++)
{
db1[i]=max(db1[i-1],db2[i-1]-prices[i]);
db2[i]=max(db2[i-1],db1[i-1]+prices[i]-fee);
}
return max(db1[prices.size()-1],db2[prices.size()-1]);
}
};