Problem Description
[https://leetcode.com/problems/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)
思路
DP!
用两个DP数组来保存状态,sell和buy
buy[i]表示,第i天是否买入的最大收益。
sell[i]表示,第i天是否卖出的最大收益。
辣么!buy[i]=Max{今天不买,今天买}=Max{buy[i-1],sell[i-2]-price[i]}
sell[i]=Max{今天不卖,今天卖}=Max{sell[i-1],buy[i-1]+peice[i]}
buy[0]=-price[0] 第一天买
buy[1]=Max{buy[0],-prices[1]} 第一天买或第二天买
sell[0]=0,第一天不能卖
sell[1]=Max{0, prices[1] - prices[0]} 第二天卖不卖
这个写DP的方法很好,要多多学习!!
[https://leetcode.com/discuss/71391/easiest-java-solution-with-explanations]
Code
package q309;
public class Solution {
public int maxProfit(int[] prices) {
if (prices.length < 2)
return 0;
int m = prices.length;
int[] buy = new int[m];
int[] sell = new int[m];
buy[0] = -prices[0];
buy[1] = Math.max(buy[0], -prices[1]);
sell[0] = 0;
sell[1] = Math.max(0, prices[1] - prices[0]);
for (int i = 2; i < m; i++) {
buy[i] = Math.max(buy[i - 1], sell[i - 2] - prices[i]);
sell[i] = Math.max(sell[i - 1], buy[i - 1] + prices[i]);
}
return Math.max(sell[m - 2], sell[m - 1]);
}
}