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]
Credits:
Special thanks to @dietpepsi for adding this problem and creating all test cases.
每次看了别人的都有一种我怎么没想到呢的感觉(倒地)
题意:
还是熟悉的股票买卖问题,感觉快成了股神。。。条件是可以无限次买卖,但是卖完必须休息至少一天才可以接着买。
思路:
动态规划最重要的是状态转移方程。首先题目有三个状态,buy,sell,cooldown,每个状态之前只有一个状态。用last_buy,last_sell,last_cooldown来表示如果上一次是买,卖,休息这几个状态时的最大利润。那么这次的前一个状态是买的话,buy=max(last_buy,last_cooldown-price)以此类推。注意初始时的赋值。
代码:
class Solution {
public int maxProfit(int[] prices) {
int l=prices.length;
if(l==0||l==1)
return 0;
if(l==2)
return Math.max(prices[1]-prices[0],0);
int buy=0,cooldown=0,sell=0,last_buy=Integer.MIN_VALUE,last_sell=0,last_cooldown=0;
for(int price:prices)
{
buy=Math.max(last_cooldown-price,last_buy);
sell=Math.max(last_buy+price,last_sell);
cooldown=Math.max(last_cooldown,last_sell);
last_sell=sell;
last_cooldown=cooldown;
last_buy=buy;
}
return sell;
}
}