【LeetCode】309. Best Time to Buy and Sell Stock with Cooldown


題目:

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 as many transactions as you like (ie, buy one and sell one share of the stock multiple times) with the following restrictions:

  • You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
  • After you sell your stock, you cannot buy stock on next day. (ie, cooldown 1 day)

Example:

prices = [1, 2, 3, 0, 2]
maxProfit = 3
transactions = [buy, sell, cooldown, buy, sell]

提示:

這道題可以用動態規划的思路解決。但是一開始想的時候總是抽象不出狀態轉移方程來,之后看到了一種用狀態機的思路,覺得很清晰,特此拿來分享,先看如下狀態轉移圖:

這里我們把狀態分成了三個,根據每個狀態的指向,我們可以得出下面的狀態轉移方程:

  • s0[i] = max(s0[i-1], s2[i-1])
  • s1[i] = max(s1[i-1], s0[i-1] - price[i])
  • s2[i] = s1[i-1] + price[i]

這樣就清晰了很多。

代碼:

 1 class Solution {
 2 public:
 3     int maxProfit(vector<int>& prices){
 4         if (prices.size() <= 1) return 0;
 5         vector<int> s0(prices.size(), 0);
 6         vector<int> s1(prices.size(), 0);
 7         vector<int> s2(prices.size(), 0);
 8         s1[0] = -prices[0];
 9         s0[0] = 0;
10         s2[0] = INT_MIN;
11         for (int i = 1; i < prices.size(); i++) {
12             s0[i] = max(s0[i - 1], s2[i - 1]);
13             s1[i] = max(s1[i - 1], s0[i - 1] - prices[i]);
14             s2[i] = s1[i - 1] + prices[i];
15         }
16         return max(s0[prices.size() - 1], s2[prices.size() - 1]);
17     }
18 };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM