<p>You are given an array <code>prices</code> where <code>prices[i]</code> is the price of a given stock on the <code>i<sup>th</sup></code> day.</p>

<p>Find the maximum profit you can achieve. You may complete as many transactions as you like (i.e., buy one and sell one share of the stock multiple times) with the following restrictions:</p>

<ul>
	<li>After you sell your stock, you cannot buy stock on the next day (i.e., cooldown one day).</li>
</ul>

<p><strong>Note:</strong> You may not engage in multiple transactions simultaneously (i.e., you must sell the stock before you buy again).</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> prices = [1,2,3,0,2]
<strong>Output:</strong> 3
<strong>Explanation:</strong> transactions = [buy, sell, cooldown, buy, sell]
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> prices = [1]
<strong>Output:</strong> 0
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= prices.length &lt;= 5000</code></li>
	<li><code>0 &lt;= prices[i] &lt;= 1000</code></li>
</ul>

class Solution:
    def maxProfit(self, prices):
        if not prices:
            return 0
        
        n = len(prices)
        hold = [0] * n  # Maximum profit if holding stock on day i
        sold = [0] * n  # Maximum profit if just sold stock on day i
        rest = [0] * n  # Maximum profit if resting on day i

        # Initial conditions
        hold[0] = -prices[0]  # If we buy on day 0, we have -prices[0] profit
        sold[0] = 0           # No stock to sell on day 0
        rest[0] = 0           # No transactions means 0 profit on day 0
        
        for i in range(1, n):
            hold[i] = max(hold[i-1], rest[i-1] - prices[i])  # Continue holding or buy today
            sold[i] = hold[i-1] + prices[i]                  # Sell the stock today
            rest[i] = max(rest[i-1], sold[i-1])              # Resting (coming from cooldown or already resting)

        # The answer is the maximum of sold or rest on the last day
        return max(sold[-1], rest[-1])

# Example usage:
solution = Solution()
print(solution.maxProfit([1, 2, 3, 0, 2]))  # Output: 3
print(solution.maxProfit([1]))              # Output: 0

17000