图片说明
注意当 i>3 时,可以相隔 2 个位置获得最大值,因此,还需要比较 arr[i] 与 max[i-3] 的和。max 存储的是当前值作为子序列结尾可获取到的最大值

func subsequence( n int ,  array []int ) int64 {
    // write code here
    if n ==0{
        return 0
    }
    if n==1{
        return int64(array[0])
    }
    maxSum := make([]int64,n)
    var max int64 = math.MinInt64
    for i:=0;i<n;i++{
        if i==0 || i==1 {
            maxSum[i] = int64(array[i])
            if maxSum[i] > max{
                max =maxSum[i]
            }
            continue
        }
        maxSum[i] = findMax(int64(array[i]),int64(array[i])+maxSum[i-2])
        if i>3{
            maxSum[i] = findMax(maxSum[i],int64(array[i])+maxSum[i-3])
        }
        if maxSum[i] > max{
            max = maxSum[i]
        }
    }
    return max
}

func findMax(a,b int64)int64{
    if a>b{
        return a
    }
    return b
}