题目:
给你一个整数数组,返回它的某个 非空 子数组(连续元素)在执行一次可选的删除操作后,所能得到的最大元素总和。换句话说,你可以从原数组中选出一个子数组,并可以决定要不要从中删除一个元素(只能删一次哦),(删除后)子数组中至少应当有一个元素,然后该子数组(剩下)的元素总和是所有子数组之中最大的。
注意,删除一个元素后,子数组 不能为空。
算法:
方法一:动态规划(状态机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
}