1. 程式人生 > >[LeetCode] 188. Best Time to Buy and Sell Stock IV 買賣股票的最佳時間 IV

[LeetCode] 188. Best Time to Buy and Sell Stock IV 買賣股票的最佳時間 IV

股票 ice not ++i int ase which before oba

Say you have an array for which the ith element is the price of a given stock on day i.

Design an algorithm to find the maximum profit. You may complete at most k transactions.

Note:
You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

Credits:

Special thanks to @Freezen for adding this problem and creating all test cases.

123. Best Time to Buy and Sell Stock III 這題是最多能交易2次,而這題是最多k次。

要用動態規劃Dynamic programming來解,需要兩個遞推公式來分別更新兩個變量local和global。定義local[i][j]為在到達第i天時最多可進行j次交易並且最後一次交易在最後一天賣出的最大利潤,此為局部最優。然後我們定義global[i][j]為在到達第i天時最多可進行j次交易的最大利潤,此為全局最優。它們的遞推式為:

local[i][j] = max(global[i - 1][j - 1] + max(diff, 0), local[i - 1][j] + diff)

global[i][j] = max(local[i][j], global[i - 1][j])

C++:

class Solution {
public:
    int maxProfit(int k, vector<int> &prices) {
        if (prices.empty()) return 0;
        if (k >= prices.size()) return solveMaxProfit(prices);
        int g[k + 1] = {0};
        int l[k + 1] = {0};
        for (int i = 0; i < prices.size() - 1; ++i) {
            int diff = prices[i + 1] - prices[i];
            for (int j = k; j >= 1; --j) {
                l[j] = max(g[j - 1] + max(diff, 0), l[j] + diff);
                g[j] = max(g[j], l[j]);
            }
        }
        return g[k];
    }
    int solveMaxProfit(vector<int> &prices) {
        int res = 0;
        for (int i = 1; i < prices.size(); ++i) {
            if (prices[i] - prices[i - 1] > 0) {
                res += prices[i] - prices[i - 1];
            }
        }
        return res;
    }
};

類似題目:

[LeetCode] 121. Best Time to Buy and Sell Stock 買賣股票的最佳時間

[LeetCode] 122. Best Time to Buy and Sell Stock II 買賣股票的最佳時間 II

[LeetCode] 123. Best Time to Buy and Sell Stock III 買賣股票的最佳時間 III

[LeetCode] 309. Best Time to Buy and Sell Stock with Cooldown 買賣股票的最佳時間有冷卻期

  

[LeetCode] 188. Best Time to Buy and Sell Stock IV 買賣股票的最佳時間 IV