最少侧跳次数——动态规划

84 阅读1分钟

image.png

代码 动态规划:

  1. d := [3]int 表示当前节点的各个跑道最少需要侧跳几次
  2. 而当前节点的各个跑道动态转移只需要由上一个节点的各个跑道转移即可
  3. 最后返回三个值的最小值
func minSideJumps(obstacles []int) int {
    d := [3]int{1, 0, 1}
    for _, x := range obstacles[1:] {
        minCnt := math.MaxInt / 2
        for j := 0; j < 3; j++ {
            if j == x-1 {
                d[j] = math.MaxInt / 2
            } else {
                minCnt = min(minCnt, d[j])
            }
        }
        for j := 0; j < 3; j++ {
            if j != x-1 {
                d[j] = min(d[j], minCnt+1)
            }
        }
    }
    return min(min(d[0], d[1]), d[2])
}

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