188. 買賣股票的最佳時機IV
解題思路:動態規劃
使用一系列變量存儲買入的狀態,再用一系列變量存儲賣出的狀態。buy[j]表示恰好進行第j筆交易,并且當前手上持有一張股票,這種情況下的最大利潤;sell[j]表示恰好進行第j筆交易,并且當前手上沒有股票,這種情況下的最大利潤。
C++:
#include <vector> #include <limits> using namespace std; class Solution { public: int maxProfit(int k, vector<int>& prices) { if (prices.empty() || k == 0) { return 0; } int n = prices.size(); k = min(k, n / 2); vector<int> buy(k + 1); vector<int> sell(k + 1); buy[0] = -prices[0]; sell[0] = 0; for (int i = 1; i <= k; ++i) { buy[i] = sell[i] = numeric_limits<int>::min() / 2; } for (int i = 1; i < n; ++i) { buy[0] = max(buy[0], sell[0] - prices[i]); for (int j = 1; j <= k; ++j) { // buy[j]表示第i-1天持有一張股票,第i天仍然持有這張股票 // sell[j] - prices[i]表示第i-1天沒有持有股票,第i天買入了一張股票 buy[j] = max(buy[j], sell[j] - prices[i]); // sell[j]表示第i-1天沒有股票,第i天仍然沒有買入股票 // buy[j - 1] + prices[i]表示第i-1天有一張股票,第i天賣出了這張股票 sell[j] = max(sell[j], buy[j - 1] + prices[i]); } } return *max_element(sell.begin(), sell.end()); } };

浙公網安備 33010602011771號