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
Example:code
prices = [1, 2, 3, 0, 2] maxProfit = 3 transactions = [buy, sell, cooldown, buy, sell]
這道題能夠用動態規劃的思路解決。可是一開始想的時候老是抽象不出狀態轉移方程來,以後看到了一種用狀態機的思路,以爲很清晰,特此拿來分享,先看以下狀態轉移圖:blog
這裏咱們把狀態分紅了三個,根據每一個狀態的指向,咱們能夠得出下面的狀態轉移方程:ip
這樣就清晰了不少。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 };