/*
计算最大利润,不能同时参与多笔交易,卖出后无法在第二天买入(冷冻期为1天)
动态规划
每一天会有三种不同的状态:
1. 目前持有一支股票,对应的[累计最大收益]为dp[i][0]
2. 目前不持有任何股票,且处于冷冻期中,对应的[累计最大收益]为dp[i][1]
3. 目前不持有任何股票,且不处于冷冻期中,对应的[累计最大收益]为dp[i][2]
注意:这里处于冷冻期是指第二天即i+1不处于冷冻期
状态转移:
1. 目前持有一支股票,可以是dp[i-1][0]就持有的股票,
也可以是不处于冷冻期然后新买入的股票,即dp[i-1][2]-prices[i],
dp[i][0] = max(dp[i-1][0], dp[i-1][2]-prices[i])
2. 目前不持有任何股票,且处于冷冻期中,
则应该是卖出了前一天持有的股票,即dp[i][1] = dp[i-1][0]+prices[i]
3. 目前不持有任何股票,且不处于冷冻期中,
dp[i][2] = max(dp[i][1], dp[i][2])
最终结果即为res = max(dp[n][1], dp[n][2]),最后一天持有股票没有意义
初始状态dp[0] = (-prices[0], 0, 0)
由于只用到了前一天的状态,因此可以进行空间压缩
*/
func maxProfit(prices []int) int {
dp := [3]int{}
dp[0] = -prices[0]
size := len(prices)
for i := 1; i < size; i++ {
old0 := dp[0]
dp[0] = max(dp[0], dp[2]-prices[i])
old1 := dp[1]
dp[1] = old0 + prices[i]
dp[2] = max(old1, dp[2])
}
return max(dp[1], dp[2])
}
/**
返回两个整数中的较大值
*/
func max(i int, j int) int {
if i >= j {
return i
}
return j
}
08-02
414
04-26
1410
05-25
275
10-28
461