【算法设计与分析实训】第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]的最大和。

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

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

相关文章

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

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

数字IC后端低功耗设计实现案例分享(3个power domain,2个voltage domain)

下图所示为咱们社区T12nm A55低功耗实现项目。其实这个项目还可以根据产品的需求做一些改进。改进后项目实现的难度会大大增加。也希望通过今天的这个项目案例分享&#xff0c;帮助到今年IC秋招的同学。 芯片低功耗设计实现upf编写指南&#xff08;附低功耗项目案例&#xff0…

Vue3中使用:deep修改element-plus的样式无效怎么办?

前言&#xff1a;当我们用 vue3 :deep() 处理 elementui 中 el-dialog_body和el-dislog__header 的时候样式一直无法生效&#xff0c;遇到这种情况怎么办&#xff1f; 解决办法&#xff1a; 1.直接在 dialog 上面增加class 我试过&#xff0c;也不起作用&#xff0c;最后用这种…

HTTP CRLF注入攻击

HTTP CRLF注入攻击 大家好&#xff0c;今天我们来聊聊一个与网络安全相关的重要话题——CRLF注入&#xff08;CRLF Injection&#xff09;。了解这种安全漏洞有助于我们更好地保护我们的应用程序和用户数据。 什么是CRLF&#xff1f; CRLF代表Carriage Return (回车) 和 Line…

免费实用的图片加水印工具

高度自定义的图片加水印工具 因工作需要和朋友的需求&#xff0c;我基于canvas开发了这款图片加水印工具。 地址&#xff1a;https://potatotools.top/toolsEntrance/pic/ImageWatermark.vue.html 功能亮点 尺寸定制 &#xff0c;轻松调整水印宽高&#xff0c;精准适配每张图…

51c自动驾驶~合集30

我自己的原文哦~ https://blog.51cto.com/whaosoft/12086789 #跨越微小陷阱&#xff0c;行动更加稳健 目前四足机器人的全球市场上&#xff0c;市场份额最大的是哪个国家的企业&#xff1f;A.美国 B.中国 C.其他 波士顿动力四足机器人 云深处 绝影X30 四足机器人 &#x1f…

优化装配,提升品质:虚拟装配在汽车制造中的关键作用

汽车是各种零部件的有机结合体&#xff0c;因此汽车的装配工艺水平和装配质量直接影响着汽车的质量与性能。在汽车装配过程中&#xff0c;经常会发生零部件间干涉或装配顺序不合理等现象&#xff0c;且许多零部件制造阶段产生的质量隐患要等到实际装配阶段才能显现出来&#xf…

进入 RPG Prime:第六周游戏指南

进入 RPG Prime&#xff0c;在这里&#xff0c;每一个任务都是一个等待展开的史诗故事。选择你的等级&#xff0c;召集你的队伍&#xff0c;开始融合策略、魔法和神话的冒险&#xff01; 本系列共有 10 篇攻略&#xff0c;贯穿 Alpha 第 4 季&#xff0c;每周都有新攻略&#…

STM32 BootLoader 刷新项目 (十) Flash擦除-命令0x56

STM32 BootLoader 刷新项目 (十) Flash擦除-命令0x56 1. STM32F407 BootLoader 中的 Flash 擦除功能详解 在嵌入式系统中&#xff0c;BootLoader 的设计是非常关键的部分&#xff0c;它负责引导主程序的启动、升级以及安全管理。而在 STM32F407 等 MCU 上实现 BootLoader&…

网页抓取API,让数据获取更简单

网页抓取的过程通常分为以下步骤&#xff0c;尤其是在面对静态网页时&#xff1a; 获取页面 HTML&#xff1a;使用 HTTP 客户端下载目标页面的 HTML 内容。解析 HTML&#xff1a;将下载的 HTML 输入解析器&#xff0c;准备提取内容。提取数据&#xff1a;利用解析器功能&#…

Golang语言整合jwt+gin框架实现token

1.下载jwt go get -u github.com/dgrijalva/jwt-go2.新建生成token和解析token文件 2.1 新建common文件夹和jwtConfig文件夹 新建jwtconfig.go文件 2.2 jwtconfig.go文件代码 /* Time : 2021/8/2 下午3:03 Author : mrxuexi File : main Software: GoLand */ package jwtC…

详细分析ipvsadm负载均衡的命令

目录 前言1. 基本知识2. 命令参数3. 拓展 前言 LVS四层负载均衡架构详解Lvs推荐阅读&#xff1a;添加链接描述 1. 基本知识 ipvsadm 是用于管理和配置 Linux 服务器上 IP Virtual Server (IPVS) 的工具&#xff0c;是 Linux 提供的一个负载均衡模块&#xff0c;支持多种负载…

量化选股日常操作日记-11-ai眼镜-润欣科技

用 微信小程序 梦想兔企业智能风险分析助手 &#xff0c;选择AI眼镜板块&#xff0c;挖掘了几个合适的股&#xff0c;分析下来感觉 润欣科技 比较安全些适合观察&#xff0c;几块到十几块波动&#xff0c;企业基本面也没有特别大问题。就是现在价位在周期波动高位&#xff0c;下…

动力学法测量金属弹性模量

&#x1f3eb;中南民族大学-⚛大学物理实验2-&#x1f4e0;通信工程2024 目录 Python代码 1. 绘制图像 2. 弹性模量数值计算 图像显示 Pycharm 豆包 MarsCode 非常强大&#xff01;有了它们&#xff0c;我在处理大学物理实验的数据及其可视化就非常方便&#xff0c;极大缩减…

NLP论文速读(EMNLP 2024)|动态奖励与提示优化来帮助语言模型的进行自我对齐

论文速读|Dynamic Rewarding with Prompt Optimization Enables Tuning-free Self-Alignment of Language Models 论文信息&#xff1a; 简介: 本文讨论的背景是大型语言模型&#xff08;LLMs&#xff09;的自我对齐问题。传统的LLMs对齐方法依赖于昂贵的训练和人类偏好注释&am…

SLM561A系列60V10-50mA单通道线性恒流LED驱动芯片,为汽车照明、景观照明助力

SLM561A系列选型参考&#xff1a; SLM561A10ae-7G SOD123 SLM561A15ae-7G SOD123 SLM561A20ae-7G SOD123 SLM561A25ae-7G SOD123 SLM561A30ae-7G SOD123 SLM561A35ae-7G SOD123 SLM561A40ae-7G SOD123 SLM561A45ae-7G SOD123 SLM561A50ae-7G SOD123 S…

RabbitMQ1:初识MQ

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

父组件提交时让各自的子组件验证表格是否填写完整

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 父组件中有三个表格&#xff0c;表格中时输入框&#xff0c;有些输入框是必填的&#xff0c;在父组件提交时需要验证这三个表格的必填输入框中是否有没填写的。 原因分析&#xff1a; 提示&#xff1a…

Siglus引擎 Unpack | 未完待续

前言 未完待续。 代码在这里&#xff1a;https://github.com/N0zoM1z0/SiglusEngine-Extract 以后随时会更新。&#xff08;&#xff09; 因为我是选择直接逆向游戏引擎&#xff0c;在无源码&#xff0c;不hook的情况下硬逆Siglus…… 路漫漫。。。 read.sav 可以直接逆Sigl…

黑马嵌入式开发入门模电基础学习笔记

学习视频: 黑马程序员嵌入式开发入门模电&#xff08;模拟电路&#xff09;基础 文章目录 背景介绍电流电压组件仿真三极管ne555PCBEDA案例&#xff1a;非接触式电笔案例&#xff1a;电子琴 背景介绍 电流 电压 组件 仿真 三极管 mos管 ne555 PCB EDA 案例&#xff1a;非接触…