C++大佬帮忙解释一下这段程序,最好是能有注释。评论区里告诉我,谢谢

题目背景最大子段和问题是指:给出一段序列,选出其中连续且非空的一段使得这段和最大。对于一个子段和a[l]+a[l+1]+...+a[r],我们称a[l]为起点,a[r]为... 题目背景
最大子段和问题是指:给出一段序列,选出其中连续且非空的一段使得这段和最大。

对于一个子段和a[l]+a[l+1]+...+a[r],我们称a[l]为起点,a[r]为终点。

题目描述
本题中,我们给定一个长度为N的数组和一个分界点M,请求出起点a[l]在a[1],a[2],...a[M]之中,终点a[r]在a[M+1],a[M+2],...,a[N]之中的最大子段和。

输入输出格式
输入格式:
第一行是两个正整数N和M,N表示了序列的长度,M表示分界点。

第二行包含N个绝对值不大于10000的整数A[i]。

(注意,这意味着可能含有负数)

输出格式:
一个整数,为最大的子段和是多少。

输入输出样例
输入样例#1:
5 3
7 -7 9 -5 -5
输出样例#1:
4
输入样例#2:
7 5
0 2 1 8 0 7 -6
输出样例#2:
18
说明
对于40%的数据,有N<=2000

对于100%的数据,有2<=N<=200000,1<=M<N。

M下标从1开始计。
展开
 我来答
hujingang562
2019-06-02 · TA获得超过316个赞
知道小有建树答主
回答量:403
采纳率:50%
帮助的人:33.1万
展开全部
格式:

第一行是一个正整数N,表示了序列的长度。

第2行包含N个绝对值不大于10000的整数A[i],描述了这段序列。

输出格式:

仅包括1个整数,为最大的子段和是多少。子段的最小长度为1。

枚举

最蠢的办法,枚举左端点和右端点,再求和,用一个max储存历史的最大值,就可以了。时间复杂度O(n3)。

View Code
在枚举的基础上,我们可以发现:求一个和为最大的子序列,那么作为任意一个子序列,若它的左端点是第i个元素,右端点是第j个元素,则它其中的元素之和可以表示为第1~j个元素和第1~i个元素之差。

这就是一个预处理。可以在枚举的基础上减少一些时间,但并不是最优,也是O(n2)。

分治

用分治求最大子段和应首先将这整个问题划分成规模更小的子问题,可以取中点,将这一个序列划分成长度相等的两个序列。对于此时的最大子段和,会出现3种情况,即:

1.最大子段和在第一个序列中,即在我们所取的中点左边。

2.最大子段和在第二个序列中,即在我们所取的中点右边;

3.最大子段和在第一个序列与第二个序列之间,即我们取的这个点被包含在这个子段中。这时,我们就应该继续以这个子段为基础,继续划分,知道不能划分为止。  

(其实上面两种情况也是要划分的)(滑稽)

将3种情况的最大子段和合并,取三者之中的最大值就为问题的解。时间复杂度
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式