【算法设计与分析实训】第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)的图像分类模型,广泛用于图像识别任务。 环…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
前端调试HTTP状态码
1xx(信息类状态码) 这类状态码表示临时响应,需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分,客户端应继续发送剩余部分。 2xx(成功类状态码) 表示请求已成功被服务器接收、理解并处…...
React核心概念:State是什么?如何用useState管理组件自己的数据?
系列回顾: 在上一篇《React入门第一步》中,我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目,并修改了App.jsx组件,让页面显示出我们想要的文字。但是,那个页面是“死”的,它只是静态…...
Java并发编程实战 Day 11:并发设计模式
【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天,今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案,它们不仅提供了优雅的设计思路,还能显著提升系统的性能…...
