in LeetCode ~ read.

LeetCode714 买卖股票最佳时机含手续

给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。

你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。

返回获得利润的最大值。

注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。

示例 1:

输入: 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.

思路:
采用动态规划算法(dp)
假设第N天,如果是卖出则利润为sale,如果是买入则利润为buy;
则,
第1天
sale=0, buy=0-prices[0];
第2天
sale=std::max(sale, buy + prices[i] - fee),用第一天卖出的利润第一天买入后今天卖出的利润相比
buy=std::max(buy, sale - prices[i]),用第一天买入的利润第一天卖出后今天买入的利润相比
第i天
...
得到某天卖出时的利润为sale,或者买入时的利润为buy;
最后比较std::max(sale, buy)得到最大利润;

但,考虑实际情况肯定是全部卖出利润最高,可以直接得到结果为 sale。

解题:

    int maxProfit(vector<int>& prices, int fee) {
        // if (prices.size() > 5000 || 0 > fee || 50000 <= fee) { return -1; }
        int buy = 0 - prices.at(0), sale = 0;  // 第一天买或卖时利润分别
        for (int i =0 ; i < prices.size(); ++i) {
            int tmp_buy = buy, tmp_sale = sale;  // 前一天买或卖时最终利润
            buy = std::max(buy, tmp_sale - prices[i]);
            sale = std::max(sale, tmp_buy + prices[i] - fee);
        }
        cout << "buy:" << buy << " sale:" << sale << endl;
        return sale;  // 股票卖出利润肯定大于持有的利润
    }