【算法设计与分析实训】第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;}
}
具体解释
这段代码是用来解决“最大子数组和”问题的,常见的动态规划问题。题目要求找到一个连续子数组,使得这个子数组的元素之和最大。你给出的代码实现了这个算法,并使用了动态规划的思想来解决。
代码步骤解释
-
输入处理:
- 代码首先从输入中读取一个整数
n,表示数组的长度。 - 然后,创建了两个数组
a和b,它们的大小都为n + 1,并初始化了这两个数组的第一个元素a[0]和b[0]为 0。 - 数组
a用于存储输入的整数(即题目给定的数组)。 - 数组
b用来存储动态规划计算的中间结果,表示以某个元素结尾的最大子数组和。
- 代码首先从输入中读取一个整数
-
填充输入数据:
- 程序通过
for循环读取接下来的n个整数,填充到数组a中。
- 程序通过
-
动态规划计算:
- 程序使用动态规划来计算最大子数组和。
b[i]表示以a[i]这个元素结尾的子数组的最大和。 - 对于每个
i,b[i]是由以下两者中的较大值决定的:b[i - 1] + a[i]:表示将当前元素a[i]加入到前面子数组的和中,形成一个新的子数组。a[i]:表示以当前元素a[i]开始一个新的子数组。
- 动态规划的核心思想就是选择这两个中的最大值,确保我们在每一步都得到最大的子数组和。
- 程序使用动态规划来计算最大子数组和。
-
更新最大值:
- 每次计算出
b[i]后,程序更新一个变量maxnum,记录迄今为止的最大子数组和。
- 每次计算出
-
输出结果:
- 最终,程序输出
maxnum,即最大子数组的和。
- 最终,程序输出
辅助方法 max(int x, int y):
这个方法简单地返回 x 和 y 中较大的那个值,用于在动态规划过程中选择更新 b[i] 和 maxnum 时用到。
代码运行实例:
假设我们输入如下数据:
n = 5
数组 = -2 1 -3 4 -1 2 1 -5 4
步骤解析:
-
输入数组:
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] -
初始化
b数组:b = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] -
计算
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
-
-
输出结果:
- 最终的最大子数组和
maxnum是6,所以程序会输出6。
- 最终的最大子数组和
总结:
这个算法通过动态规划方法,通过迭代每个元素来更新当前的最大子数组和。时间复杂度是 O(n),其中 n 是数组的长度,因为我们只需要遍历一遍数组来计算最大子数组和。
深度解析举例
这段代码实现了一个经典的算法——最大子数组和问题(Maximum Subarray Problem)。具体来说,给定一个整数数组,找出其中连续子数组的最大和。这个问题可以通过动态规划来解决。
代码解释
-
导入Scanner类:
import java.util.Scanner;这行代码引入了Java标准库中的
Scanner类,用于从控制台读取用户输入。 -
定义主类MaxSubSum:
public class MaxSubSum {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);定义了一个名为
MaxSubSum的公共类,并在其内部定义了main方法作为程序入口点。同时创建了一个Scanner对象用于读取用户输入。 -
读取数组长度及初始化数组:
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的整型数组a和b。数组a用于存储用户输入的整数,而数组b则用于存储动态规划过程中计算得到的中间结果。这里将这两个数组的第一个元素初始化为0。 -
读取用户输入的整数并存入数组a中:
for (int i = 1; i <= n; i++) {a[i] = scanner.nextInt();}scanner.close();使用for循环依次读取
n个整数,并将其存入数组a中。最后关闭scanner对象以释放资源。 -
动态规划计算最大子数组和:
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。 -
输出结果:
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
程序执行过程如下:
n=5,即接下来会输入5个整数。- 输入的整数分别为:
-2, 1, -3, 4, -1。 - 动态规划计算最大子数组和的过程如下表所示:
| i | a[i] | b[i] = max(b[i-1]+a[i], a[i]) | maxnum |
|---|---|---|---|
| 1 | -2 | max(0±2, -2) | -2 |
| 2 | 1 | max(-2+1, 1) | 1 |
| 3 | -3 | max(1±3, -3) | 1 |
| 4 | 4 | max(1+4, 4) | 5 |
| 5 | -1 | max(5±1, -1) | 5 |
最终,程序输出的结果是5,这对应于原数组中的子数组[4, -1, 2, 1]的最大和。
相关文章:
【算法设计与分析实训】第1关:求序列的最大字段和
务描述 本关任务:编写用动态规划解决最大字段和问题。 相关知识 为了完成本关任务,你需要掌握:动态规划。 编程要求 给定由n个整数(可能为负数)组成的序列:a1,a2,……,an, 求该序列的最大子段和。当所有整…...
【澜舟科技-注册/登录安全分析报告】
前言 由于网站注册入口容易被机器执行自动化程序攻击,存在如下风险: 暴力破解密码,造成用户信息泄露,不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 ,造成用户无法登陆、注册,大量收到垃圾短信的…...
【读书笔记-《网络是怎样连接的》- 7】Chapter3_2 路由器
本篇继续介绍路由器及其转发过程。 1 路由器内部结构 路由器内部结构图如图所示。 即主要包含左侧的包转发模块和右侧的端口模块。转发模块负责查找包的发送目的地,端口模块完成包的发送。通过安装不同的硬件,转发模块不仅可以支持以太网,也…...
Android Activity 基础接口知识和常见问题
Activity 知识点及问题点 接口onMultiWindowModeChangedonConfigurationChanged 常见问题Android解决点击桌面图标,就重新启动应用程序问题 接口 onMultiWindowModeChanged 定义 onMultiWindowModeChanged是Android中Activity类的一个回调方法。它会在活动…...
利用python 检测当前目录下的所有PDF 并转化为png 格式
以下是一个完整的 Python 脚本,用于检测当前目录下的所有 PDF 文件并将每一页转换为 PNG 格式: import os from pdf2image import convert_from_path# 设置输出图像的 DPI(分辨率) DPI 300# 获取当前目录 current_directory os…...
解决 Spring Boot 中 `Ambiguous mapping. Cannot map ‘xxxController‘ method` 错误
前言 在使用 Spring Boot 开发 Web 应用时,经常会遇到各种各样的错误。其中一种常见的错误是 Ambiguous mapping. Cannot map ‘testController‘ method。本文将详细介绍这个错误的原因及解决方法,帮助开发者快速定位并解决问题。 错误解释 这个错误…...
C++ 函数返回值优化
本文中部分内容来自下面的文章,还有一部分来自智谱清言 C 返回值优化_c 局部变量返回优化-CSDN博客 elision:省略 copy elision:拷贝省略 RVO (Return Value Optimization):返回值优化 ------ 我最近也遇到了上面博文中说到的问题&…...
c++源码阅读__ThreadPool__正文阅读
一. 简介 本章我们开始阅读c git 高星开源项目ThreadPool, 这是一个纯c的线程池项目, 并且代码量极小, 非常适合新手阅读 git地址: progschj / ThreadPool 二. 前提知识 为了面对不同读者对c掌握情况不同的情况, 这里我会将基本上稍微值得一说的前提知识点, 全部专门写成一篇…...
关于ES的查询
查询结果那么多字段都是什么? 为什么会提到这个问题呢,因为默认ES查询的结果会有很多信息,我们可能并不希望要那么多数据,所以你需要了解这些字段都表示什么,并正确的返回和使用它们。 took– Elasticsearch 运行查询…...
数据结构初识
目录 1.初识 2.时间复杂度 常见时间复杂度举例: 3.空间复杂度 4.包装类&简单认识泛型 4.1装箱和拆箱 5.泛型 6.泛型的上界 7.泛型方法 8.List接口 1.初识 1.多画图 2.多思考 3.多写代码 4.多做题 牛客网-题库/在线编程/剑指offer 算法篇:…...
保存数据到Oracle时报错ORA-17004: 列类型无效: 1111
1、问题描述: 关键信息:Mybatis;Oracle (1)保存信息到Oracle时报错: Caused by: org.apache.ibatis.type.TypeException: Error setting null for parameter #10 with JdbcType OTHER . Try setting a dif…...
Excel——宏教程(1)
Microsoft excel是一款功能非常强大的电子表格软件。它可以轻松地完成数据的各类数学运算,并用各种二维或三维图形形象地表示出来,从而大大简化了数据的处理工作。但若仅利用excel的常用功能来处理较复杂的数据,可能仍需进行大量的人工操作。…...
论文浅尝 | MindMap:知识图谱提示激发大型语言模型中的思维图(ACL2024)
笔记整理:和东顺,天津大学硕士,研究方向为软件缺陷分析 论文链接:https://aclanthology.org/2024.acl-long.558/ 发表会议:ACL 2024 1. 动机 虽然大语言模型(LLMs)已经在自然语言理解和生成任务…...
第6章:TDengine 标签索引和删除数据
TDengine 标签索引和删除数据 目标 掌握标签索引的创建、删除掌握超表、子表创建以及数据删除删除数据 删除数据是 TDengine 提供的根据指定时间段删除指定表或超级表中数据记录的功能,方便用户清理由于设备故障等原因产生的异常数据。 注意:删除数据并不会立即释放该表所…...
【微软:多模态基础模型】(5)多模态大模型:通过LLM训练
欢迎关注[【youcans的AGI学习笔记】](https://blog.csdn.net/youcans/category_12244543.html)原创作品 【微软:多模态基础模型】(1)从专家到通用助手 【微软:多模态基础模型】(2)视觉理解 【微…...
海外带云仓多语言商城源码,多语言多商家云仓一键代发商城
新增海外仓,云仓国际供应链系统,商家可登陆云仓进行批量发货 商城修复了一些bug以及增加了订单数字提示,优化加载速度,二开了一些细微功能 基于 PHP Laravel 框架开发的一款 Web 商城系统。 1.前端多国语言自由切换,…...
android:taskAffinity 对Activity退出时跳转的影响
android:taskAffinity 对Activity跳转的影响 概述taskAffinity 的工作机制taskAffinity对 Activity 跳转的影响一个实际的开发问题总结参考 概述 在 Android 开发中,任务栈(Task)是一个核心概念。它决定了应用程序的 Activity 如何相互交互以…...
Apache Dolphinscheduler数据质量源码分析
Apache DolphinScheduler 是一个分布式、易扩展的可视化数据工作流任务调度系统,广泛应用于数据调度和处理领域。 在大规模数据工程项目中,数据质量的管理至关重要,而 DolphinScheduler 也提供了数据质量检查的计算能力。本文将对 Apache Do…...
solana链上智能合约开发案例一则
环境搭建 安装Solana CLI:Solana CLI是开发Solana应用的基础工具。你可以通过官方文档提供的安装步骤,在本地环境中安装适合你操作系统的Solana CLI版本。安装完成后,使用命令行工具进行配置,例如设置网络环境(如开发网…...
使用 PyTorch 实现 ZFNet 进行 MNIST 图像分类
在本篇博客中,我们将通过两个主要部分来演示如何使用 PyTorch 实现 ZFNet,并在 MNIST 数据集上进行训练和测试。ZFNet(ZFNet)是基于卷积神经网络(CNN)的图像分类模型,广泛用于图像识别任务。 环…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
