[Mdp] lc1186. 删除一次得到子数组最大和(dp+分治+算法优化+进阶)

1. 题目来源

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

2. 题目解析

该问题的一个基础问题是 [Edp] lc53. 最大子序和(dp+分治+算法优化+详细分析)。即采用 dp 的方式, O ( n ) O(n) O(n) 求取数组中的最大子数组和。

回顾:

  • 状态定义:f[i] 为以 i 为右端点的最大子数组和。
  • 状态转移:f[i]=max(f[i-1]+a[i], a[i])=max(f[i-1], 0)+a[i] 这是一个常用的转换写法,想法也比较明确。如果 f[i-1] 都已经小于 0 了,那也不需要前面的这些子数组了。

看看本题:

  • 本题要求可以删除一个元素 i,然后保证剩下的子数组最大。
  • 最终子数组有两种形式:
    • 只包含一段元素,即不进行删除的情况。
    • 有两段元素,将 i 位置删除的情况
  • 那么这个最终构成的子数组,可以转化为:以 i 为分界点,前缀是一个最大子段和、后缀是一个最大子段和。
  • 我们已经得到了 f 是一个从 0~i 中,以 i 结尾的最大子段和子数组。
  • 只需要再预处理得到一个 g,g 是一个从 i~n-1 中,以 i 结尾的最大子段和子数组。

如下图:
在这里插入图片描述

y 总还讲了一个状态机的思路,和官解感觉大差不差,但是转移方程不太一样。官解中讲解的是一个非常标准的一个 dp 思路,也可以看看。

其实重点还是 [Edp] lc53. 最大子序和(dp+分治+算法优化+详细分析) 这个问题,前后缀分解、改进dp 都是在这个基础之上产生的变种题目。


  • 时间复杂度 O ( n ) O(n) O(n)
  • 空间复杂度 O ( 1 ) O(1) O(1)

前后缀分解:

class Solution {
public:
    int maximumSum(vector<int>& arr) {
        int n = arr.size();
        vector<int> f(n), g(n);
        f[0] = arr[0], g[n - 1] = arr[n - 1];

        int res = f[0]; // 注意状态初始化,枚举最大值
        for (int i = 1; i < n; i ++ ) {
            f[i] = max(f[i - 1], 0) + arr[i];
            res = max(res, f[i]);  // 枚举第一种情况:不需要进行删除的一种情况,在 g 中枚举也是一样的
        }

        for (int j = n - 2; j >= 0; j -- ) {
            g[j] = max(g[j + 1], 0) + arr[j];
        }

        for (int i = 1; i < n - 1; i ++ ) {
            res = max(res, f[i - 1] + g[i + 1]);    // 枚举第二种情况:需要删除的场景,以 i 为分界点
        }

        return res;
    }
};

相关推荐

  1. 1186. 删除得到数组

    2024-07-22 13:24:04       19 阅读
  2. DP长递增序列

    2024-07-22 13:24:04       57 阅读
  3. 力扣1717.删除字符串的得分

    2024-07-22 13:24:04       24 阅读
  4. 每日OJ题_数组dp①_力扣53. 数组

    2024-07-22 13:24:04       34 阅读
  5. leetcode热题100.乘积数组(动态规划

    2024-07-22 13:24:04       18 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 13:24:04       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 13:24:04       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 13:24:04       45 阅读
  4. Python语言-面向对象

    2024-07-22 13:24:04       55 阅读

热门阅读

  1. electron 主进程和渲染进程通信

    2024-07-22 13:24:04       14 阅读
  2. 一个养殖类的网站的设计

    2024-07-22 13:24:04       17 阅读
  3. 基于深度学习的病变检测

    2024-07-22 13:24:04       16 阅读
  4. 阿里云服务器使用Docker安装JDK 8

    2024-07-22 13:24:04       13 阅读
  5. Model Import Settings

    2024-07-22 13:24:04       13 阅读
  6. Spring Boot 的无敌描述

    2024-07-22 13:24:04       15 阅读
  7. 简述ETL工具Informatica

    2024-07-22 13:24:04       13 阅读
  8. 瀚高数据库初级考试认证

    2024-07-22 13:24:04       11 阅读
  9. 28. Find the Index of the First Occurrence in a String

    2024-07-22 13:24:04       14 阅读
  10. WSL 2 Oracle Linux 9.1 安装配置

    2024-07-22 13:24:04       18 阅读
  11. 项目进行到中后期,我发现开发改了代码

    2024-07-22 13:24:04       19 阅读
  12. OpenStack中nova的架构

    2024-07-22 13:24:04       14 阅读