算法应用实例:最大子列和问题

给定N个整数的序列{A1,A2,……AN},求函数f(i,j)=max\left \{ 0, \sum_{k=i}^{j}A_{k}\right \}的最大值。

分析:求该序列中最大的连续子列和,若函数最后为负数,返回0作为程序结束。

1.算法1

/*命名为MaxSubseqSum1,A[]:输入整数序列,N:整数序列里面的个数*/
int MaxSubseqSum1( int A[], int N)
{
    int ThisSum, MaxSum = 0;

    for(i = 0; i < N; i++) /*i是子列左端位置*/
    {
        for(j = i; j<N; j++) /*j是子列·右端位置*/
        {
            ThisSum = 0; /*从A[i]-A[j]之间的子列和*/
            for(k = i; k <= j; k++)
                This +=A[k];
            if(ThisSum > MaxSum) /*判断这个子列和是否大于最大子列和*/
                MaxSum = ThisSum; /*更新最大子列和*/
        } /*j循环结束*/
    }/*i循环结束*/

    return MaxSum;
}

 时间复杂度:T(N)=O(N^3)

2.算法2

/*命名为MaxSubseqSum2,A[]:输入整数序列,N:整数序列里面的个数*/
int MaxSubseqSum2( int A[], int N)
{
    int ThisSum, MaxSum = 0;
    int i, j;

    for(i = 0; i < N; i++) /*i是子列左端位置*/
    {
        ThisSum = 0; /*从A[i]-A[j]之间的子列和*/
        for(j = i; j<N; j++) /*j是子列·右端位置*/
        {
            This +=A[j]; /*相同的i不同的j,只要在j-1次循环的基础上累加1项*/
            if(ThisSum > MaxSum) /*判断这个子列和是否大于最大子列和*/
                MaxSum = ThisSum; /*更新最大子列和*/
        } /*j循环结束*/
    }/*i循环结束*/

    return MaxSum;
}

时间复杂度:T(N)=O(N^2)

3.算法3:分而治之

 思路:将一个大问题分割成小块,分头解决,最后结果合并。

解决问题:(1)将数组均分成两部分;

(2)递归的解决两边的问题,解决左边问题得到左边的最大子列和,解决右边问题得到右边的最大子列和。从左往右扫描,求最大子列和

(3)求跨越边界的最大子列和。

例:

(1)均分数组

(2)递归到左半边,继续递归左半边

递归到右半边

(3)求跨越边界最大子列和

 

时间复杂度:T(N)=T(N/2)+T(N/2)=O(N)

递推公式:T(N)=2T(N/2)+cN,        T(1)=O(1)

                         =2[2T(N/2^2)+cN/2]+cN

                         =2^kO(1)+ckN        其中,N/2^k=1                

                         =O(NlogN)

3.算法4:在线处理

/*命名为MaxSubseqSum2,A[]:输入整数序列,N:整数序列里面的个数*/
int MaxSubseqSum3( int A[], int N)
{
    int ThisSum, MaxSum;
    int i;
    ThisSum = MaxSum = 0;
    for(i = 0; i < N; i++) /*i是子列左端位置*/
    {
        This +=A[i]; /*向右累加*/            
            if(ThisSum > MaxSum) /*判断这个子列和是否大于最大子列和*/
                MaxSum = ThisSum; /*更新最大子列和*/
            else if(This < 0) /*如果当前子列和为负*/
                ThisSum = 0; /*此时相加不能使后面部分和增大,丢弃*/
    }/*i循环结束*/

    return MaxSum;
}

时间复杂度:T(N)=O(N)

在线的意思是,指每输入一个数据就进行即时处理,在任何一个地方中止输入,算法都能正常给出当前的解。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

7-29 删除字符串中的子串

题目链接&#xff1a;7-29 删除字符串中的子串 一. 题目 1. 题目 2. 输入输出样例 3. 限制 二、代码&#xff08;python&#xff09; 1. 代码实现 str1 input().split(\n)[0] str2 input().split(\n)[0] while str2 in str1:str1 str1.replace(str2, "") // 删…

第4篇:创建Nios II工程之Hello_World<三>

Q&#xff1a;接着我们再来完成Nios II软件工程设计部分。 A&#xff1a;从Quartus Tools选择Nios II Software Build Tools for Eclipse&#xff0c;打开Nios II SBT软件&#xff0c;Workspace指定到hello_world工程的software文件夹路径&#xff1b;再从File-->New-->…

使用STM32CubeMX对STM32F4的CAN1/2/3配置及接收中断开启

目录 1. CAN配置1.1引脚&#xff08;STM32F413VGT6-LQFP100&#xff09;1.2 时钟1.3 RCC配置1.4 CAN1配置1.5 CAN2配置1.6 CAN3配置1.7 输出设置 2. CAN代码2.1 CAN初始化2.2 CAN滤波器设置2.3 CAN使能2.4 激活中断2.5 CAN发送函数2.6 CAN回调函数2.7 main之后的代码 1. CAN配置…

数据分析:生存分析原理和应用实例

介绍 生存分析的目的是分析某个时间点的“生存概率”是多少。基于这样的研究目的,需要提供生存数据,它是一种由不同的开始时间和结束时间组成的事件-时间的数据,比如在癌症研究领域,研究手术到死亡的过程、治疗到疾病进展等等。 在开展生存分析前,需要了解什么是删失(c…

二维码门楼牌管理应用平台建设:隐患统计与智能管理

文章目录 前言一、二维码门楼牌管理应用平台概述二、隐患统计功能的重要性三、隐患统计的实现方式四、隐患统计的实践应用五、面临的挑战与未来发展 前言 随着城市管理的不断升级&#xff0c;二维码门楼牌管理应用平台已成为现代城市管理的重要工具。该平台通过集成先进的信息…

WCH RISC CH32V303RCT6 单片机的SDI Printf 虚拟串口功能 类似SEGGER RTT打印功能 简单分析

参考&#xff1a; 有关于 SDI printf 更多的信息和资料吗&#xff1f; 关于 CH32 系列 MCU SDI 虚拟串口功能的使用 【CH32X035 评估板测评】 教你使用 SDI 接口重定向 printf SDI (Serial Data Interface) 是沁恒微电子 RISC-V 内核的私有外设接口,CH32 RISC-V 系列目前提供了…

PDCA循环:持续精进的工具

文章目录 一、什么是PDCA二、PDCA的应用场景三、PDCA在信息系统项目管理中的应用 一、什么是PDCA PDCA循环是由美国质量管理专家沃特阿曼德休哈特&#xff08;Walter A. Shewhart&#xff09;在20世纪30年代提出的&#xff0c;最初用于制造业的质量管理。休哈特博士在构想PDCA…

二极管钳位型三电平SVPWM(羊角波)闭环系统simulink建模与仿真

整理了二极管钳位型三电平SVPWM&#xff08;羊角波&#xff09;闭环系统simulink建模与仿真模型&#xff0c;附赠参考资料。 在二极管钳位型三电平SVPWM中&#xff0c;通过控制逆变器的开关器件&#xff08;IGBT&#xff09;的导通和关断&#xff0c;将输入的直流电压转换为三…

知网怎么查重 知网查重的详细步骤

知网查重八个步骤&#xff1a;1. 访问官网&#xff0c;注册账号。2. 上传待查文档。3. 选择查重规则。4. 选择相似来源库。5. 提交查重任务。6. 等待查重结果。7. 获取查重报告。8. 下载查重报告。 知网查重的详细步骤 第一步&#xff1a;进入知网查重系统 打开浏览器&#x…

怎样将便签软件搬家?便签迁移攻略

便签软件已成为我们日常生活中不可或缺的记录工具。无论是重要的工作内容&#xff0c;还是琐碎的生活事务&#xff0c;我们都会在便签中一一记下。然而&#xff0c;当我们需要更换电脑或其他设备时&#xff0c;如何将这些珍贵的便签内容迁移到新设备上&#xff0c;成为了许多人…

2024全国大学生高新技术竞赛——算法智星挑战赛 解题报告(流水账版) | 珂学家

前言 评价 因为第一届的缘故吧&#xff0c;导致这场比赛异常的简单。所以不太好评价这块。 怎么说呢&#xff1f; 体验有点差 题目难度没有区分度有两题还存在SPJ判定问题&#xff0c;导致赛时没一人过。 题目分布&#xff0c;简单题占大部分&#xff0c;中等级占一小部分&…

Ubuntu查看端口状态

完蛋了&#xff0c;好像动心了&#xff0c;近一周吃啥东西都索然无味&#xff0c;这可如何是好&#xff01;&#xff01;&#xff01;不知道在期待什么&#xff0c;恐惧与窃喜—— 在Ubuntu系统中&#xff0c;查看某个端口是否被放行&#xff08;即允许流量通过&#xff09;&am…

【JAVA进阶篇教学】第六篇:Java线程中状态

博主打算从0-1讲解下java进阶篇教学&#xff0c;今天教学第六篇&#xff1a;Java线程中状态。 理解并掌握线程的休眠、停止和挂起等操作是多线程编程中的重要内容。下面我将详细说明这些操作&#xff0c;并提供相应的代码案例。 目录 一、线程休眠&#xff08;Thread Slee…

一个早安寄语打卡的小程序技术分享

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 1.早起打卡还能赚钱&#xff1f; 是的&#xff0c;你没有听错&#xff0c;最近发现了个非常有意思的小程序&#xff0c;主要是让用户早起早睡&#xff0c;然后每天进行打卡操作的。 当然&…

【KG+RAG 论文】医学知识图谱检索增强 LLM 的框架 —— KG-RAG

论文&#xff1a;Biomedical knowledge graph-enhanced prompt generation for large language models ⭐⭐⭐ Code&#xff1a;github.com/BaranziniLab/KG_RAG 文章目录 论文速读模型效果总结 论文速读 这篇论文提出了 KG-RAG 的框架&#xff0c;使用医学知识图谱&#xff0…

黑马面试篇

课程地址&#xff1a;新版Java面试专题视频教程&#xff0c;java八股文面试全套真题深度详解&#xff08;含大厂高频面试真题&#xff09;_哔哩哔哩_bilibili 课程名称&#xff1a;新版Java面试专题视频教程&#xff0c;java八股文面试全套真题深度详解&#xff08;含大厂高频…

【Protobuf】protobuf详细介绍

protobuf详细介绍 一、前言二、Protobuf简介2.1、核心思想2.2、Protobuf是如何工作的&#xff1f;2.3、如何使用 Protoc 生成代码&#xff1f;2.4 入门命令 一、前言 在以往的项目中进行网络通信和数据交换的应用场景中&#xff0c;最经常使用的技术便是json或xml。随着JSON的…

用户中心 -- 插件使用 插件使用思路

易错注意点 1 5.1启动类 & 入口类 需保持一致 网址&#xff1a; 第一节课&#xff0c;用户管理--后端初始化&#xff0c;项目调通。二次翻工2-CSDN博客 一、 用户管理 框架 网址&#xff1a; 用户管理 --汇总 -- 明细-CSDN博客 1.2 更改路径&#xff0c;并生效 网址…

盘点那些你不知道的“痛”,柯桥俄语培训

首先我们来看一下болеть的五大含义&#xff1a; ①(чем 及无补语) 生病&#xff0c;患病 例&#xff1a; болеть тифом 害伤寒病 болеть воспалением лёгких 得肺炎 ②[只用第3人称] болит&#xff0c;болят 疼痛 例&am…

CDGA|数据治理新视角:清洗数据,让数据质量飞跃提升

在数据治理的新视角下&#xff0c;数据清洗不再是一个孤立的环节&#xff0c;而是与数据收集、存储、分析和应用紧密相连。它涉及到数据的全生命周期&#xff0c;从源头开始就对数据进行严格的把控。在数据收集阶段&#xff0c;通过设定合理的数据规范和校验机制&#xff0c;确…
最新文章