最大子段和问题.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
最大子段和问题.ppt

最大子段和问题 制作:七(10)班王晶晶 【题目描述】 给定一组数列,求连续子段和最大值。 【输入格式】 第一行一个数n,表示数列长度(n=100000) 第二行,n个数,表示一个数列,每个整数的绝对值不超过1000。 【输出格式】 一个整数,为最大的连续段和。 【输入样例】 5 1 -2 3 -2 3 【输出样例】 4 最大子段为3,-2,3 本题是需要从已经给的数据中找出一个连续的子段,使得其和最大。注意,不可以排序,必须在题目所给数据的基础上实现。 最大子段和问题解法多样,在这里只介绍三种。 解法(1): 【算法概括】三重循环枚举实现 【算法分析】要在原数据中确定一个子段就需要知道这个子段的“头”和“尾”,也就是这个子段的起始点和终点。我们可以使用两重循环来分别枚举“头”“尾”。因为要算最大子段和,所以还要用一重循环进行求和,一共就是三重循环。 【时间复杂度】O(n3) 可以支持200以内的数据 模拟样例: 1 -2 3 -2 3 -1 2 0 3 1 模拟样例: 1 -2 3 -2 3 1 -1 2 0 3 -2 1 -1 2 模拟样例: 1 -2 3 -2 3 1 -1 2 0 3 -2 1 -1 2 3 1 4 模拟样例: 1 -2 3 -2 3 1 -1 2 0 3 -2 1 -1 2 3 1 4 -2 1 3 所以,最大的子段和为4 4 代码: var n,i,j,k,max,ans:longint; a:array[1..100]of longint; begin read(n); for i:=1 to n do read(a[i]); ans:=-maxlongint; for i:=1 to n do for j:=i to n do begin max:=0;//注意初始化 for k:=i to j do max:=max+a[k]; if maxans then ans:=max; end; write(ans); end. ①//不能不初始化或置为0 ②//不能像排序一样写,单个数字也可以作为子段 注释①: ①:答案初始化 Ans:=-maxlongint; 这里不可以置为0或是不初始化。最大字段和求解的数据中一定会有负数的数据(如果都是正数最大子段和就是所有数字相加),所以置为0的错误的初始化,比如下面的这种数字就过不了。 5 -1 -2 -3 -4 -5 这个数据的最大子段和是-1(单个-1一段),但如果初始化为0或不初始化答案就会是0。 注释②: ②:枚举头尾 for i:=1 to n do for j:=i to n do//这里不能用像排序的循环方式: for i:=1 to n-1 do for j:=i+1 to n do 如果采用这样的循环方式所求的最大子段和就不包括单个数字为一段的答案。对于以下这种数据会出现错误。 5 1 -2 -3 -4 -5 这个数据的最大子段和是1(单个1一段)。但如果采用错用的循环方式所做出的答案就会是-1(1和-2)。 解法(2): 【算法概括】两重循环枚举+预处理 【算法分析】虽然第一种解法最容易理解,但是效率非常低,而且有很多的和是重复计算过的。比如计算第二个数到第五个数和第三个数到第五个数时,从第三个数到第五个数的和进行了重复计算。在这种情况下,可以进行一定的简单优化。用一重循环将第一个数到第i个数之间的和都先计算好,那么到枚举时就可以直接使用,省去了一重求和的循环。 【时间复杂度】O(n2) 可以支持3000以内的数据 数据模拟: 用t[i]来表示从第1个数到第i个数的和 t[1] t[2]

文档评论(0)

magui + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8140007116000003

1亿VIP精品文档

相关文档