给你一个整数数组,返回它的某个 非空 子数组(连续元素)在执行一次可选的删除操作后,所能得到的最大元素总和。

    换句话说,你可以从原数组中选出一个子数组,并可以决定要不要从中删除一个元素(只能删一次哦),(删除后)子数组中至少应当有一个元素,然后该子数组(剩下)的元素总和是所有子数组之中最大的。

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

    请看示例:

    示例 1:

    输入:arr = [1,-2,0,3]
    输出:4
    解释:我们可以选出 [1, -2, 0, 3],然后删掉 -2,这样得到 [1, 0, 3],和最大。
    示例 2:

    输入:arr = [1,-2,-2,3]
    输出:3
    解释:我们直接选出 [3],这就是最大和。

    思路:$dp[$i][0] 表示以i结尾的最大值 $dp[$i][1] 表示以i结尾除去一个数据的最大值

    1. <?php
    2. class Solution {
    3. /**
    4. * @param Integer[] $arr
    5. * @return Integer
    6. */
    7. function maximumSum($arr) {
    8. $len = count($arr);
    9. if($len <= 0){
    10. return 0;
    11. }
    12. $dp[0][0] = $arr[0];
    13. $dp[0][1] = PHP_INT_MIN;
    14. $max1 = max($dp[0][1],$dp[0][0]);
    15. for($i = 0;$i < $len;++$i){
    16. $dp[$i][0] = max($dp[$i-1][0]+$arr[$i],$arr[$i]);
    17. $dp[$i][1] = max($dp[$i-1][0],($dp[$i-1][1] == PHP_INT_MIN ? 0 : $dp[$i-1][1]) + $arr[$i]);
    18. $max1 = max($max1,max($dp[$i][0], $dp[$i][1]));
    19. }
    20. return $max1;
    21. }
    22. }

    ```

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/maximum-subarray-sum-with-one-deletion
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。