当前位置: 首页 > news >正文

【算法设计与分析实训】第1关:求序列的最大字段和

务描述
本关任务:编写用动态规划解决最大字段和问题。

相关知识
为了完成本关任务,你需要掌握:动态规划。

编程要求
给定由n个整数(可能为负数)组成的序列:a1,a2,……,an, 求该序列的最大子段和。当所有整数均为负数,定义其最大子段和为0。

解题思路:
定义b[j]=max(a[i]+a[i+1]+…+a[j]),其中1<=i<=j,并且1<=j<=n。那么所求的最大子段和可以表示为max b[j],1<=j<=n。
由b[j]的定义可知,当b[j−1]>0时b[j]=b[j−1]+a[j],否则b[j]=a[j]。故b[j]的动态规划递归表达式为:
b[j]=max(b[j−1]+a[j],a[j]),1<=j<=n。

测试说明
平台会对你编写的代码进行测试:

测试输入:

6
-2 11 -4 13 -5 -2

输出示例:

20

开始你的任务吧,祝你成功!

package step1;
import java.util.Scanner;public class MaxSubSum{public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 读取第一个整数N,表示数组的长度int n = scanner.nextInt();// 创建两个整型数组,a用于存储输入的整数,b用于动态规划存储的中间结果,int[] a = new int[n + 1];int[] b = new int[n + 1];// 初始数组第0个元素为0a[0] = 0;b[0] = 0;// 读取n个整数,存入数组a中for (int i = 1; i < n + 1; i++) {//小于10a[i] = scanner.nextInt();}// 关闭scanner对象scanner.close();// 初始化最大子数组和为0int maxnum = 0;// 动态规划计算最大子数组的和for (int i = 1; i <= n; i++) {//这个地方的等于9b[i] = max(b[i - 1] + a[i], a[i]);// 更新全局最大子数组的和maxnum = max(maxnum,b[i]);}// 输出最大子数组的和System.out.println(maxnum);}// 辅助private static int max(int x, int y) {if (x >= y) {return x;}return y;}
}

具体解释

这段代码是用来解决“最大子数组和”问题的,常见的动态规划问题。题目要求找到一个连续子数组,使得这个子数组的元素之和最大。你给出的代码实现了这个算法,并使用了动态规划的思想来解决。

代码步骤解释

  1. 输入处理

    • 代码首先从输入中读取一个整数 n,表示数组的长度。
    • 然后,创建了两个数组 ab,它们的大小都为 n + 1,并初始化了这两个数组的第一个元素 a[0]b[0] 为 0。
    • 数组 a 用于存储输入的整数(即题目给定的数组)。
    • 数组 b 用来存储动态规划计算的中间结果,表示以某个元素结尾的最大子数组和。
  2. 填充输入数据

    • 程序通过 for 循环读取接下来的 n 个整数,填充到数组 a 中。
  3. 动态规划计算

    • 程序使用动态规划来计算最大子数组和。b[i] 表示以 a[i] 这个元素结尾的子数组的最大和。
    • 对于每个 ib[i] 是由以下两者中的较大值决定的:
      • b[i - 1] + a[i]:表示将当前元素 a[i] 加入到前面子数组的和中,形成一个新的子数组。
      • a[i]:表示以当前元素 a[i] 开始一个新的子数组。
    • 动态规划的核心思想就是选择这两个中的最大值,确保我们在每一步都得到最大的子数组和。
  4. 更新最大值

    • 每次计算出 b[i] 后,程序更新一个变量 maxnum,记录迄今为止的最大子数组和。
  5. 输出结果

    • 最终,程序输出 maxnum,即最大子数组的和。

辅助方法 max(int x, int y)

这个方法简单地返回 xy 中较大的那个值,用于在动态规划过程中选择更新 b[i]maxnum 时用到。

代码运行实例:

假设我们输入如下数据:

n = 5
数组 =  -2 1 -3 4 -1 2 1 -5 4

步骤解析

  1. 输入数组a = [-2, 1, -3, 4, -1, 2, 1, -5, 4]

    在这里,我们将 a[0] 设为 0,所以实际存储的数组 a 为:

    a = [0, -2, 1, -3, 4, -1, 2, 1, -5, 4]
    
  2. 初始化 b 数组b = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

  3. 计算 b 数组并更新 maxnum

    • i = 1
      b[1] = max(b[0] + a[1], a[1]) = max(0 + (-2), -2) = -2
      maxnum = max(maxnum, b[1]) = max(0, -2) = 0

    • i = 2
      b[2] = max(b[1] + a[2], a[2]) = max(-2 + 1, 1) = 1
      maxnum = max(maxnum, b[2]) = max(0, 1) = 1

    • i = 3
      b[3] = max(b[2] + a[3], a[3]) = max(1 + (-3), -3) = -2
      maxnum = max(maxnum, b[3]) = max(1, -2) = 1

    • i = 4
      b[4] = max(b[3] + a[4], a[4]) = max(-2 + 4, 4) = 4
      maxnum = max(maxnum, b[4]) = max(1, 4) = 4

    • i = 5
      b[5] = max(b[4] + a[5], a[5]) = max(4 + (-1), -1) = 3
      maxnum = max(maxnum, b[5]) = max(4, 3) = 4

    • i = 6
      b[6] = max(b[5] + a[6], a[6]) = max(3 + 2, 2) = 5
      maxnum = max(maxnum, b[6]) = max(4, 5) = 5

    • i = 7
      b[7] = max(b[6] + a[7], a[7]) = max(5 + 1, 1) = 6
      maxnum = max(maxnum, b[7]) = max(5, 6) = 6

    • i = 8
      b[8] = max(b[7] + a[8], a[8]) = max(6 + (-5), -5) = 1
      maxnum = max(maxnum, b[8]) = max(6, 1) = 6

    • i = 9
      b[9] = max(b[8] + a[9], a[9]) = max(1 + 4, 4) = 5
      maxnum = max(maxnum, b[9]) = max(6, 5) = 6

  4. 输出结果

    • 最终的最大子数组和 maxnum6,所以程序会输出 6

总结

这个算法通过动态规划方法,通过迭代每个元素来更新当前的最大子数组和。时间复杂度是 O(n),其中 n 是数组的长度,因为我们只需要遍历一遍数组来计算最大子数组和。

深度解析举例

这段代码实现了一个经典的算法——最大子数组和问题(Maximum Subarray Problem)。具体来说,给定一个整数数组,找出其中连续子数组的最大和。这个问题可以通过动态规划来解决。

代码解释

  1. 导入Scanner类

    import java.util.Scanner;
    

    这行代码引入了Java标准库中的Scanner类,用于从控制台读取用户输入。

  2. 定义主类MaxSubSum

    public class MaxSubSum {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);
    

    定义了一个名为MaxSubSum的公共类,并在其内部定义了main方法作为程序入口点。同时创建了一个Scanner对象用于读取用户输入。

  3. 读取数组长度及初始化数组

            int n = scanner.nextInt();int[] a = new int[n + 1];int[] b = new int[n + 1];a[0] = 0;b[0] = 0;
    

    用户首先输入一个整数n,表示接下来要输入的整数数量。然后创建两个大小为n+1的整型数组ab。数组a用于存储用户输入的整数,而数组b则用于存储动态规划过程中计算得到的中间结果。这里将这两个数组的第一个元素初始化为0。

  4. 读取用户输入的整数并存入数组a中

            for (int i = 1; i <= n; i++) {a[i] = scanner.nextInt();}scanner.close();
    

    使用for循环依次读取n个整数,并将其存入数组a中。最后关闭scanner对象以释放资源。

  5. 动态规划计算最大子数组和

            int maxnum = 0;for (int i = 1; i <= n; i++) {b[i] = Math.max(b[i - 1] + a[i], a[i]);maxnum = Math.max(maxnum, b[i]);}
    

    初始化变量maxnum为0,用于记录当前找到的最大子数组和。通过遍历数组a,利用动态规划的思想更新数组b,使得b[i]表示以第i个元素结尾的最大子数组和。每次更新完b[i]后,检查是否需要更新全局最大值maxnum

  6. 输出结果

            System.out.println(maxnum);}private static int max(int x, int y) {if (x >= y) {return x;}return y;}
    }
    

    最后,程序输出全局最大子数组和maxnum。此外还定义了一个辅助函数max,用于比较两个整数并返回较大者。不过实际上,在上述代码中已经使用了Math.max()函数替代了这个自定义的max函数,因此该函数并未被调用。

实例

假设用户输入如下数据:

5
-2 1 -3 4 -1 2 1 -5 4

程序执行过程如下:

  1. n=5,即接下来会输入5个整数。
  2. 输入的整数分别为:-2, 1, -3, 4, -1
  3. 动态规划计算最大子数组和的过程如下表所示:
ia[i]b[i] = max(b[i-1]+a[i], a[i])maxnum
1-2max(0±2, -2)-2
21max(-2+1, 1)1
3-3max(1±3, -3)1
44max(1+4, 4)5
5-1max(5±1, -1)5

最终,程序输出的结果是5,这对应于原数组中的子数组[4, -1, 2, 1]的最大和。

相关文章:

【算法设计与分析实训】第1关:求序列的最大字段和

务描述 本关任务&#xff1a;编写用动态规划解决最大字段和问题。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;动态规划。 编程要求 给定由n个整数&#xff08;可能为负数&#xff09;组成的序列&#xff1a;a1,a2,……,an, 求该序列的最大子段和。当所有整…...

【澜舟科技-注册/登录安全分析报告】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…...

【读书笔记-《网络是怎样连接的》- 7】Chapter3_2 路由器

本篇继续介绍路由器及其转发过程。 1 路由器内部结构 路由器内部结构图如图所示。 即主要包含左侧的包转发模块和右侧的端口模块。转发模块负责查找包的发送目的地&#xff0c;端口模块完成包的发送。通过安装不同的硬件&#xff0c;转发模块不仅可以支持以太网&#xff0c;也…...

Android Activity 基础接口知识和常见问题

Activity 知识点及问题点 接口onMultiWindowModeChangedonConfigurationChanged 常见问题Android解决点击桌面图标&#xff0c;就重新启动应用程序问题 接口 onMultiWindowModeChanged 定义 onMultiWindowModeChanged是Android中Activity类的一个回调方法。它会在活动&#xf…...

利用python 检测当前目录下的所有PDF 并转化为png 格式

以下是一个完整的 Python 脚本&#xff0c;用于检测当前目录下的所有 PDF 文件并将每一页转换为 PNG 格式&#xff1a; import os from pdf2image import convert_from_path# 设置输出图像的 DPI&#xff08;分辨率&#xff09; DPI 300# 获取当前目录 current_directory os…...

解决 Spring Boot 中 `Ambiguous mapping. Cannot map ‘xxxController‘ method` 错误

前言 在使用 Spring Boot 开发 Web 应用时&#xff0c;经常会遇到各种各样的错误。其中一种常见的错误是 Ambiguous mapping. Cannot map ‘testController‘ method。本文将详细介绍这个错误的原因及解决方法&#xff0c;帮助开发者快速定位并解决问题。 错误解释 这个错误…...

C++ 函数返回值优化

本文中部分内容来自下面的文章&#xff0c;还有一部分来自智谱清言 C 返回值优化_c 局部变量返回优化-CSDN博客 elision:省略 copy elision&#xff1a;拷贝省略 RVO (Return Value Optimization)&#xff1a;返回值优化 ------ 我最近也遇到了上面博文中说到的问题&…...

c++源码阅读__ThreadPool__正文阅读

一. 简介 本章我们开始阅读c git 高星开源项目ThreadPool, 这是一个纯c的线程池项目, 并且代码量极小, 非常适合新手阅读 git地址: progschj / ThreadPool 二. 前提知识 为了面对不同读者对c掌握情况不同的情况, 这里我会将基本上稍微值得一说的前提知识点, 全部专门写成一篇…...

关于ES的查询

查询结果那么多字段都是什么&#xff1f; 为什么会提到这个问题呢&#xff0c;因为默认ES查询的结果会有很多信息&#xff0c;我们可能并不希望要那么多数据&#xff0c;所以你需要了解这些字段都表示什么&#xff0c;并正确的返回和使用它们。 took– Elasticsearch 运行查询…...

数据结构初识

目录 1.初识 2.时间复杂度 常见时间复杂度举例&#xff1a; 3.空间复杂度 4.包装类&简单认识泛型 4.1装箱和拆箱 5.泛型 6.泛型的上界 7.泛型方法 8.List接口 1.初识 1.多画图 2.多思考 3.多写代码 4.多做题 牛客网-题库/在线编程/剑指offer 算法篇&#xff1a…...

保存数据到Oracle时报错ORA-17004: 列类型无效: 1111

1、问题描述&#xff1a; 关键信息&#xff1a;Mybatis&#xff1b;Oracle &#xff08;1&#xff09;保存信息到Oracle时报错&#xff1a; Caused by: org.apache.ibatis.type.TypeException: Error setting null for parameter #10 with JdbcType OTHER . Try setting a dif…...

Excel——宏教程(1)

Microsoft excel是一款功能非常强大的电子表格软件。它可以轻松地完成数据的各类数学运算&#xff0c;并用各种二维或三维图形形象地表示出来&#xff0c;从而大大简化了数据的处理工作。但若仅利用excel的常用功能来处理较复杂的数据&#xff0c;可能仍需进行大量的人工操作。…...

论文浅尝 | MindMap:知识图谱提示激发大型语言模型中的思维图(ACL2024)

笔记整理&#xff1a;和东顺&#xff0c;天津大学硕士&#xff0c;研究方向为软件缺陷分析 论文链接&#xff1a;https://aclanthology.org/2024.acl-long.558/ 发表会议&#xff1a;ACL 2024 1. 动机 虽然大语言模型&#xff08;LLMs&#xff09;已经在自然语言理解和生成任务…...

第6章:TDengine 标签索引和删除数据

TDengine 标签索引和删除数据 目标 掌握标签索引的创建、删除掌握超表、子表创建以及数据删除删除数据 删除数据是 TDengine 提供的根据指定时间段删除指定表或超级表中数据记录的功能,方便用户清理由于设备故障等原因产生的异常数据。 注意:删除数据并不会立即释放该表所…...

【微软:多模态基础模型】(5)多模态大模型:通过LLM训练

欢迎关注[【youcans的AGI学习笔记】](https://blog.csdn.net/youcans/category_12244543.html&#xff09;原创作品 【微软&#xff1a;多模态基础模型】&#xff08;1&#xff09;从专家到通用助手 【微软&#xff1a;多模态基础模型】&#xff08;2&#xff09;视觉理解 【微…...

海外带云仓多语言商城源码,多语言多商家云仓一键代发商城

新增海外仓&#xff0c;云仓国际供应链系统&#xff0c;商家可登陆云仓进行批量发货 商城修复了一些bug以及增加了订单数字提示&#xff0c;优化加载速度&#xff0c;二开了一些细微功能 基于 PHP Laravel 框架开发的一款 Web 商城系统。 1.前端多国语言自由切换&#xff0c;…...

android:taskAffinity 对Activity退出时跳转的影响

android:taskAffinity 对Activity跳转的影响 概述taskAffinity 的工作机制taskAffinity对 Activity 跳转的影响一个实际的开发问题总结参考 概述 在 Android 开发中&#xff0c;任务栈&#xff08;Task&#xff09;是一个核心概念。它决定了应用程序的 Activity 如何相互交互以…...

Apache Dolphinscheduler数据质量源码分析

Apache DolphinScheduler 是一个分布式、易扩展的可视化数据工作流任务调度系统&#xff0c;广泛应用于数据调度和处理领域。 在大规模数据工程项目中&#xff0c;数据质量的管理至关重要&#xff0c;而 DolphinScheduler 也提供了数据质量检查的计算能力。本文将对 Apache Do…...

solana链上智能合约开发案例一则

环境搭建 安装Solana CLI&#xff1a;Solana CLI是开发Solana应用的基础工具。你可以通过官方文档提供的安装步骤&#xff0c;在本地环境中安装适合你操作系统的Solana CLI版本。安装完成后&#xff0c;使用命令行工具进行配置&#xff0c;例如设置网络环境&#xff08;如开发网…...

使用 PyTorch 实现 ZFNet 进行 MNIST 图像分类

在本篇博客中&#xff0c;我们将通过两个主要部分来演示如何使用 PyTorch 实现 ZFNet&#xff0c;并在 MNIST 数据集上进行训练和测试。ZFNet&#xff08;ZFNet&#xff09;是基于卷积神经网络&#xff08;CNN&#xff09;的图像分类模型&#xff0c;广泛用于图像识别任务。 环…...

车轮上的科技:Spring Boot汽车新闻集散地

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理汽车资讯网站的相关信息成为必然。开发合适…...

IDEA2023 SpringBoot整合Web开发(二)

一、SpringBoot介绍 由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。SpringBoot提供了一种新的编程范式&#xff0c;可以更加快速便捷…...

国产三维CAD 2025新动向:推进MBD模式,联通企业设计-制造数据

本文为CAD芯智库原创整理&#xff0c;未经允许请勿复制、转载&#xff01; 上一篇文章阿芯分享了影响企业数字化转型的「MBD」是什么、对企业优化产品设计流程有何价值——这也是国产三维CAD软件中望3D 2024发布会上&#xff0c;胡其登先生&#xff08;中望软件产品规划与GTM中…...

ubuntu 之 安装mysql8

安装 # 如果 ubuntu 版本 > 20.04 则不用执行 wget 这步 wget https://dev.mysql.com/get/mysql-apt-config_0.8.12-1_all.debsudo apt-get updatesudo apt-get install mysql-server mysql-client 安装过程中如果没有提示输入密码 sudo cat /etc/mysql/debian.cnf # 查…...

Flink Lookup Join(维表 Join)

Lookup Join 定义&#xff08;支持 Batch\Streaming&#xff09; Lookup Join 其实就是维表 Join&#xff0c;比如拿离线数仓来说&#xff0c;常常会有用户画像&#xff0c;设备画像等数据&#xff0c;而对应到实时数仓场景中&#xff0c;这种实时获取外部缓存的 Join 就叫做维…...

Elasticsearch retrievers 通常与 Elasticsearch 8.16.0 一起正式发布!

作者&#xff1a;来自 Elastic Panagiotis Bailis Elasticsearch 检索器经过了重大改进&#xff0c;现在可供所有人使用。了解其架构和用例。 在这篇博文中&#xff0c;我们将再次深入探讨检索器&#xff08;retrievers&#xff09;。我们已经在之前的博文中讨论过它们&#xf…...

【并发模式】Go 常见并发模式实现Runner、Pool、Work

通过并发编程在 Go 程序中实现的3种常见的并发模式。 参考&#xff1a;https://cloud.tencent.com/developer/article/1720733 1、Runner 定时任务 Runner 模式有代表性&#xff0c;能把&#xff08;任务队列&#xff0c;超时&#xff0c;系统中断信号&#xff09;等结合起来…...

【前端知识】Javascript前端框架Vue入门

前端框架VUE入门 概述基础语法介绍组件特性组件注册Props 属性声明事件组件 v-model(双向绑定)插槽Slots内容与出口 组件生命周期样式文件使用1. 直接在<style>标签中写CSS2. 引入外部CSS文件3. 使用CSS预处理器4. 在main.js中全局引入CSS文件5. 使用CSS Modules6. 使用P…...

Springboot3.3.5 启动流程之 Bean创建流程

在文章Springboot3.3.5 启动流程&#xff08;源码分析&#xff09;中我们只是粗略的介绍了bean 的装配(Bean的定义)流程和实例化流程分别开始于 finishBeanFactoryInitialization 和 preInstantiateSingletons. 其实,在Spring boot中&#xff0c;Bean 的装配是多阶段的&#xf…...

golang反射函数注册

package main import ( “fmt” “reflect” ) type Job interface { New([]interface{}) interface{} Run() (interface{}, error) } type DetEd struct { Name string Age int } // 为什么这样设计 // 这样就避免了 在创建新的实例的之后 结构体的方法中接受者为指针类型…...

重庆定制型网站建设/seo怎样优化网站

第一步 安装必要的工具首先要安装必要的包。包有&#xff1a;libncurses5-dev(menuconfig需要的)和essentialsudo apt-get install build-essential bin86 kernel-packagesudo apt-get install libqt3-headers libqt3-mt-dev //sudo apt-get install makesudo apt-get install…...

湖北做网站的公司/如何做好推广工作

一、No module ‘xformers’. Proceeding without it. 这是因为没有安装xformers导致的。 解决办法&#xff1a; 在webui-user.bat文件这添加一行&#xff1a; set COMMANDLINE_ARGS--xformers如下图所示&#xff1a; 试着点击webui-user.bat&#xff0c;看能否下载&#xff…...

网站建设制作设计公司哪家好/php免费开源crm系统

// 1、引入命名空间Ext.namespace("ExtUD.Ext");//相当于java中包的作用// 2、编写自定义控件类ExtUD.Ext.UDPanel Ext.extend(Ext.Panel, { title : 自定义控件, html:自定义控件面板, layout:fit, getAlert:function(){alert(自定义控件函数&#xff01;)…...

做网站一般需要多久/全球疫情最新消息

如何使用远程服务器跑项目 内容精选换一换远程桌面协议(Remote Desktop Protocol&#xff0c;RDP)&#xff0c;是微软提供的多通道的远程登录协议。本节为您介绍如何使用RDP文件远程登录Windows弹性云服务器。从管理控制台下载的RDP文件对应唯一的云服务器&#xff0c;当前RDP文…...

谷歌做网站推广/seo网络优化推广

这里是没有颜色的: /*** Created by 东东 on 2018/10/28.** Description 发送邮件部分接口*/ public interface MailService {/*** Description //TODO 发送简单的文本文件&#xff0c;to:收件人 subject:主题 content:内容* Param [to, subject, content]**/public void send…...

开锁换锁做网站/百度一下知道首页

铜雀台赋(曹植) 从明后以嬉游兮&#xff0c;登层台以娱情。 见太府之广开兮&#xff0c;观圣德之所营。 建高门之嵯峨兮&#xff0c;浮双阙乎太清。 立中天之华观兮&#xff0c;连飞阁乎西城。 临漳水之长流兮&#xff0c;望园果之滋荣。 立双台于左右兮&#xff0c;有玉龙与金…...