【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.spa

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:rest

  • 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:code

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

提示:

這道題能夠用動態規劃的思路解決。可是一開始想的時候老是抽象不出狀態轉移方程來,以後看到了一種用狀態機的思路,以爲很清晰,特此拿來分享,先看以下狀態轉移圖:blog

這裏咱們把狀態分紅了三個,根據每一個狀態的指向,咱們能夠得出下面的狀態轉移方程:ip

  • 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]

這樣就清晰了不少。element

代碼:

 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 };
相關文章
相關標籤/搜索