1186. 删除一次得到子数组最大和

78 阅读1分钟

题目:
给你一个整数数组,返回它的某个 非空 子数组(连续元素)在执行一次可选的删除操作后,所能得到的最大元素总和。换句话说,你可以从原数组中选出一个子数组,并可以决定要不要从中删除一个元素(只能删一次哦),(删除后)子数组中至少应当有一个元素,然后该子数组(剩下)的元素总和是所有子数组之中最大的。

注意,删除一个元素后,子数组 不能为空

算法:
方法一:动态规划(状态机DP)
以arr[i]结尾的连续子数组: 未删除元素的最大值:dp0[i] = max(dp[i - 1] + arr[i], arr[i]) 删除了元素的最大值:dp1[i] = max(dp1[i - 1] + arr[i], dp0[i - 1])

func maximumSum(arr []int) int {
    if len(arr) == 1 {
        return arr[0]
    }
    ans := math.MinInt32
    // dp0, dp1分别表示未删除元素和删除一个元素的子数组最大和
    dp0, dp1 := arr[0], 0
    for i := 1; i < len(arr); i ++ {
        preDp0 := dp0
        dp0 = max(dp0 + arr[i], arr[i])
        dp1 = max(dp1 + arr[i], preDp0)
        ans = max(max(ans, dp0), dp1)
    }
    return ans
}

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