买卖股票最佳时机——动态规划

40 阅读1分钟

image.png

动态规划:

  1. a[i] 表示第(i+1)次买入,b[i] 表示第(i+1)次卖出
  2. 当前状态可以由两种状态转化而来,一种是继承前一天的自己,一种是由前一天的买入卖出状态相互转换
  3. 不需要考虑当天是否可以多次买入卖出,因为这种操作不会产生收益,也就是不会影响结果
  4. 所以我们只需要一直更新 a, b 数组即可
  5. 最后返回 b[k-1]
func maxProfit(k int, prices []int) int {
    a := make([]int, k)
    b := make([]int, k)
    for i := range a {
        a[i] = -prices[0]
    }
    for _, v := range prices {
        for i := range a {
            if i > 0{
                a[i] = max(a[i], b[i-1]-v)
                b[i] = max(b[i], a[i]+v)
            }else {
                a[i] = max(a[i], -v)
                b[i] = max(b[i], a[i]+v)
            }
        }
    }
    return b[k-1]
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}