func maxProfit(k int, prices []int) int {
n := len(prices)
if n == 0 {
return 0
}
k = min(k, n / 2)
buy := make([]int, k + 1)
sell := make([]int, k + 1)
buy[0] = -prices[0]
for i := 1; i <= k; i ++ {
buy[i] = math.MinInt64 / 2
sell[i] = math.MinInt64 / 2
}
for i := 1; i < n; i ++ {
//可以选择是否把今天当作第一天买入,保证最优性。
buy[0] = max(buy[0], sell[0] - prices[i])
for j := 1; j <= k ; j ++ {
//表示当天根据之前保存卖出的状态买入,还是之前保存的买入。
buy[j] = max(buy[j], sell[j] - prices[i])
//表示卖出上次出售的,以及之前保存的卖出状态。
sell[j] = max(sell[j], buy[j - 1] + prices[i])
}
}
return max(sell...)
}
func max(a ...int) int {
res := a[0]
for _, v := range a[1:] {
if v > res {
res = v
}
}
return res
}