买卖股票的最佳时机含手续费(买定离手)

买卖股票的最佳时机含手续费

算法分析

题目介绍

	一天股票有一个价格,用一个数组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]);

    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值