参考博客:LeetCode 309: 一个很清晰的DP解题思路
生动形象,图解一目了然
题目传送:309. 最佳买卖股票时机含冷冻期
类似于《逻辑与计算机设计基础》中的状态图,根据状态图写出转化方程:
s[i] = Math.max(s[i-1], sell[i-1]);
buy[i] = Math.max(buy[i-1], s[i-1]-prices[i]);
sell[i] = buy[i-1]+prices[i];
s[i],buy[i],sell[i] 分别表示最后一次操作是冷冻,买,卖的利益的最大值。
完整代码:
// 最佳买卖股票时机 (含冷冻期)
class Solution {
public int maxProfit(int[] prices) {
int len = prices.length;
if(prices == null || len == 0) return 0;
int[] s = new int[len];
int[] buy = new int[len];
int[] sell = new int[len];
// 分别表示最后一天是 冷冻期, 买, 卖的最大收益
buy[0] = -prices[0];
s[0] = 0;
sell[0] = 0;
for(int i = 1; i < len; i++) {
s[i] = Math.max(s[i-1], sell[i-1]);
buy[i] = Math.max(buy[i-1], s[i-1]-prices[i]);
sell[i] = buy[i-1]+prices[i];
}
return Math.max(buy[len-1], Math.max(sell[len-1], s[len-1]));
}
}