力扣每日一题1186. 删除一次得到子数组最大和【动态规划】

news2024/11/24 22:57:14

本题的核心在于对于每个元素,我们分别考虑保留和删除两种状态,并根据前面的状态转移来更新当前状态。最后,遍历所有元素,找到最大和即可。

状态定义

  • dp[i][0] 表示以第 i 个元素结尾且未删除元素的子数组的最大和。
  • dp[i][1] 表示以第 i 个元素结尾且删除了一个元素后的子数组的最大和。

状态转移方程

dp[i][0]

这是比较容易理解的部分。对于 dp[i][0],我们只需要考虑当前元素是否能使前面的子数组和变得更大:

dp[i][0]=max(dp[i−1][0],0)+arr[i]

这里的 max(dp[i-1][0], 0) 意味着:

  • 如果 dp[i-1][0] 是正的,加上当前元素 arr[i] 可以让子数组和变大。

  • 如果 dp[i-1][0] 是负的,我们不需要前面的子数组,直接从 arr[i] 开始一个新的子数组。

dp[i][1]

对于 dp[i][1],我们需要考虑是否删除一个元素,具体分为以下两种情况:

  1. arr[i] 是正的。

  2. arr[i] 是负的。

arr[i] 是正的:

如果当前元素是正的,我们可以选择将它加到之前的子数组上,因为这样肯定能使子数组和变大。这里需要考虑的是:

  • 前面的子数组是否已经删除过一个元素 (dp[i-1][1]),如果是且 dp[i-1][1] 是正的,则可以加上当前元素。

  • 如果 dp[i-1][1] 不是正的,我们就可以看作从 i-1 开始新起一个子数组(即第 i-1 个元素是被删除的那个)。

公式为:dp[i][ 1]=max(dp[i−1][1]+arr[i],dp[i−1][0])

arr[i] 是负的:

对于负数,我们有两种选择:

  1. 删除当前的负数 arr[i],接上前面的子数组,这样最大和就是 dp[i-1][0]

  2. 不删除当前的负数,而是把它加到已经删除过一个元素的子数组上(即 dp[i-1][1]),这时最大和是 dp[i-1][1] + arr[i]

公式为: ·dp[i][1]=max(dp[i−1][0],dp[i−1][1]+arr[i])

代码实现

public class Solution {
    public int maximumSum(int[] arr) {
        int n = arr.length;
        int[][] dp = new int[n][2];

        dp[0][0] = arr[0];
        dp[0][1] = 0;  // 刚开始没有删除元素,删除后至少应保留一个元素

        int maxSum = arr[0];

        for (int i = 1; i < n; i++) {
            // 状态转移方程
            dp[i][0] = Math.max(dp[i - 1][0], 0) + arr[i];
            dp[i][1] = Math.max(dp[i - 1][1] + arr[i], dp[i - 1][0]);

            // 更新最大和
            maxSum = Math.max(maxSum, Math.max(dp[i][0], dp[i][1]));
        }

        return maxSum;
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        int[] arr1 = {1, -2, 0, 3};
        int[] arr2 = {1, -2, -2, 3};
        int[] arr3 = {-1, -1, -1, -1};
        
        System.out.println(solution.maximumSum(arr1)); // 4
        System.out.println(solution.maximumSum(arr2)); // 3
        System.out.println(solution.maximumSum(arr3)); // -1
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1939181.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ClamAV:Linux病毒查杀软件安装使用

简介&#xff1a;ClamAV是一个开源防病毒工具包&#xff0c;专为邮件网关上的电子邮件扫描而设计。它提供了许多实用程序&#xff0c;包括一个灵活且可扩展的多线程守护进程、一个命令行扫描程序和用于自动数据库更新的高级工具。该软件包的核心是以共享库的形式提供的防病毒引…

大豆叶部病害soybean-目标检测数据集(包括VOC格式、YOLO格式)

大豆叶部病害soybean-目标检测数据集&#xff08;包括VOC格式、YOLO格式&#xff09; 数据集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1DIq2vp-z_fM7Xj_nsBAGBQ?pwdk373 提取码&#xff1a;k373 数据集信息介绍&#xff1a; 共有 1232 张图像和一一对应的标注…

python 打包

#导出依赖文件列表 pip freeze > requirements.txt #安装对应文件 pip install -r requirements.txt #将依赖打成对应whl文件 pip wheel --wheel-dir ./dist -r ./requirements.txt #安装whl文件 pip install …whl

消费金融系统开发回忆录

架构设计图 整个支付链路上的功能 支付系统应该有&#xff1a;账户管理、渠道管理、支付管理、对账管理、清算管理、结算管理 一笔支付订单&#xff0c;在支付系统侧就是要记录清楚&#xff0c;谁发起的、对哪个商品进行支付、通过哪个渠道支付、支付时间、支付结果等…

【Linux知识点汇总】07 Linux系统防火墙相关命令,关闭和开启防火墙、开放端口号

​完整系列文章目录 【Linux知识点汇总】 心血来潮突然想起之前写过的系列文章【Linux知识点汇总】还未完结&#xff0c;那么今天就继续吧 说明&#xff1a;这个系列的内容&#xff0c;在系列【Linux服务器Java环境搭建】中会经常用到&#xff0c;大家可以自行查找相关命令 一、…

SMU Summer 2024 div2 2nd

文章目录 The Second Week一、前言二、算法1.二分图匹配/匈牙利算法<1>&#xff08;[ZJOI2007]矩阵游戏&#xff09;<2>&#xff08;有大家喜欢的零食吗&#xff09; 2.优先队列<1>&#xff08;Running Median&#xff09;<2>&#xff08;旅途的终点&a…

运维团队如何高效监控容器化环境中的PID及其他关键指标

随着云计算和容器化技术的快速发展&#xff0c;越来越多的企业开始采用容器化技术来部署和管理应用程序。然而&#xff0c;容器化环境的复杂性和动态性给运维团队带来了前所未有的挑战。本文将从PID&#xff08;进程标识符&#xff09;监控入手&#xff0c;探讨运维团队如何高效…

下载最新版Anaconda、安装、更换源、配置虚拟环境并在vscode中使用

文章目录 进入官网进入下载页安装更换源配置虚拟环境env安装包requests在vscode中使用虚拟环境 进入官网 https://repo.anaconda.com/ 或进入清华大学下载 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 进入下载页 安装 更换源 查看已经存在的镜像源 bash cond…

windows实现端口转发

最近在做界面开发时&#xff0c;想要直接在手机上看看实际效果&#xff0c;由于我的服务器是放在虚拟机上的&#xff0c;所以需要在window上面做个端口转发&#xff0c;这就需要用到netsh命令。 添加端口转发 netsh interface portproxy add v4tov4 listenport8080 listenadd…

广州机房搬迁网络部署方案

新机房网络部署应包括核心模块、业务模块、光传输模块、安全模块、流量采集模块、路由模块、带外管理模块等&#xff0c;每个模块都根据业务需求规划成多个POD&#xff08;Point Of Delivery&#xff0c;基本物理设计单元&#xff09;。 核心模块部署主要实现各业务模块的高速互…

语义分割——为什么单通道8bit灰度图像能显示多种色块???

目录 一、问题二、解答2.1 标签图的实际存储格式2.2 标签图的显示颜色2.3 颜色映射示例 三、应用颜色映射3.1 OpenCV显示标签图3.2 Matplotlib显示标签图 四、总结 一、问题 大家在做语义分割时不知道有没有这样的疑惑&#xff0c;使用打标签工具后&#xff0c;标签图是单通道…

大气热力学(15)——热力学图的应用之三(逆温)

文章目录 15.1 逆温的概念15.2 辐射逆温15.2.1 辐射逆温的形成原因15.2.2 辐射逆温的生消过程15.2.3 辐射逆温在探空图的特征15.2.4 辐射雾的形成与特征 15.3 平流逆温15.3.1 平流逆温的形成原因15.3.2 平流雾的形成与特征 15.4 湍流逆温15.4.1 湍流逆温的形成原因15.4.2 湍流逆…

Unity XR Interaction Toolkit(VR、AR交互工具包)记录安装到开发的流程,以及遇到的常见问题(一)!

提示&#xff1a;文章有错误的地方&#xff0c;还望诸位大神不吝指教&#xff01; 文章目录 前言一、XR Interaction Toolkit是什么&#xff1f;二、跨平台交互三、 AR 功能四、XR Interaction Toolkit的特点五、XR Interaction Toolkit 示例总结 前言 随着VR行业的发展&#…

移动设备安全革命:应对威胁与解决方案

移动设备已成为我们日常工作和家庭生活中不可或缺的工具&#xff0c;然而&#xff0c;对于它们安全性的关注和投资仍然远远不够。本文深入分析了移动设备安全的发展轨迹、目前面临的威胁态势&#xff0c;以及业界对于这些安全漏洞响应迟缓的深层原因。文中还探讨了人们在心理层…

Python酷库之旅-第三方库Pandas(030)

目录 一、用法精讲 79、pandas.Series.dtype属性 79-1、语法 79-2、参数 79-3、功能 79-4、返回值 79-5、说明 79-6、用法 79-6-1、数据准备 79-6-2、代码示例 79-6-3、结果输出 80、pandas.Series.shape属性 80-1、语法 80-2、参数 80-3、功能 80-4、返回值 …

2024杭电多校1——1008位运算

Problem Description 小丁最近对位运算很感兴趣&#xff0c;通过学习&#xff0c;他知道了按位与 ⊗&#xff0c;按位异或 ⊕&#xff0c;以及按位或 ⊖ 三种常见位运算。 按位与 ⊗&#xff1a;二进制下每一位做与&#xff0c;即 0⊗00,0⊗10,1⊗00,1⊗11。 按位异或 ⊕&am…

【MySQL】:想学好数据库,不知道这些还想咋学

客户端—服务器 客户端是一个“客户端—服务器”结构的程序 C&#xff08;client&#xff09;—S&#xff08;server&#xff09; 客户端和服务器是两个独立的程序&#xff0c;这两个程序之间通过“网络”进行通信&#xff08;相当于是两种角色&#xff09; 客户端 主动发起网…

SQL GROUPING运算符详解

在大数据开发中,我们经常需要对数据进行分组和汇总分析。 目录 1. GROUPING运算符概念2. 语法和用法3. 实际应用示例4. GROUPING运算符的优势5. 高级应用场景5.1 与CASE语句结合使用5.2 多维数据分析 6. 性能考虑和优化技巧7. GROUPING运算符的局限性8. 最佳实践9. GROUPING与其…

第6章 单片机的定时器/计数器

6.1 定时/计数器的结构与工作原理 6.2 定时器的控制 6.3 定时/计数器的工作方式 6.4 定时/计数器的编程和应用 6.1 定时/计数器的结构与工作原理 6.1.1 定时/计数器的基本原理 纯软件定时/计数方法&#xff1a; 定时——空循环预定周次&#xff0c;等待预定时间 计数—…

义务外贸wordpress独立站主题

健身器材wordpress网站模板 跑步机、椭圆机、划船机、动感单车、健身车、深蹲架、龙门架、健身器材wordpress网站模板。 https://www.jianzhanpress.com/?p4251 农业机械wordpress网站模板 植保机械、畜牧养殖机械、农机配件、土壤耕整机械、农业机械wordpress网站模板。 …