309.最佳买卖股票时机含冷冻期
309.最佳买卖股票时机含冷冻期
题解
题目:一次操作可以买股票,卖股票,啥都不干,在卖股票的下一天是冷冻期,不能买股票,求最大利润
思路:dp
State: dp[i][0]持股 时的最大利润 dp[i][1]不持股 时的最大利润 dp[i][2]冷冻期 时的最大利润 Function: //持股的状态转移:【上一次持股,这次啥都不干】,或者【冷冻期之后买入本次的股票】 dp[i][0] = max(dp[i-1][0], dp[i-1][2]-prices[i]) //不持股的状态转移:【上一次持股,这一次卖出】,不能啥都不干,因为定义是不持股 dp[i][1] = dp[i-1][0] + prices[i] //冷冻期的状态专业:【上一次卖出,即不持股】,或者【上一次冷冻期,本次啥都不干】 dp[i][2] = max(dp[i-1][1], dp[i-1][2]) Intialization: dp[0][0] = -prices[0] dp[0][1] = 0 dp[0][2] = 0 Answer: max(dp[n-1][1], dp[n-1][2])
代码
func maxProfit(prices []int) (ans int) { n := len(prices) dp := make([][3]int, n) //dp[i][0]持股 //dp[i][1]不持股 //dp[i][2]冷冻期 dp[0][0] = -prices[0] for i := 1; i < n; i++ { dp[i][0] = max(dp[i-1][0], dp[i-1][2]-prices[i]) dp[i][1] = dp[i-1][0] + prices[i] dp[i][2] = max(dp[i-1][1], dp[i-1][2]) } return max(dp[n-1][1], dp[n-1][2]) } func max(i, j int) int { if i > j { return i } return j }