https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/
Idea
对于第n天来说,我们有三种状态:
- 手上有一只股票
- 手上没有股票,并且不处于冷冻期
- 手上没有股票,处于冷冻期
分别设这三种状态 第n天结束的时候的最大收益为f[n][0],f[n][1],f[n][2].
手上有一只股票
如果今天我们手上有一只股票,那么对于昨天来说 可能的操作有
- 昨天手上也有一只股票 什么都没做
- 昨天手上本来没有股票,买入了一只股票
由此 得到状态方程
手上没有股票
如果今天我们手上没有股票 那么对于昨天来说 可能的操作:
- 昨天手上也没有股票
- 昨天处于冷冻期
由此 得到状态转移方程
处于冷冻期
如果今天结束处于冷冻期 那么昨天
- 昨天手上有股票 今天卖掉了
所以我们要求的就是手上没有股票 和处于冷冻期的第n天的最大值
Code
public static int maxProfit(int[] prices) {
int size=prices.length;
int[][] dp=new int[size][3];
dp[0][0]=-prices[0];
for(int i=1;i<size;i++)
{
dp[i][0]=Math.max(dp[i-1][0], dp[i-1][1]-prices[i]);
dp[i][1]=Math.max(dp[i-1][1], dp[i-1][2]);
dp[i][2]=dp[i-1][0]+prices[i];
}
return Math.max(dp[size-1][1], dp[size-1][2]);
}
三个状态 定义了三个数组来进行状态之间的转移