`
cm14k
  • 浏览: 30652 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

最大子段和(三)

阅读更多

最大子段和问题

解法三:

算法分析:


对于序列a,设j代表当前序列的终点,i代表当前序列的起点

分析:如果a[i]是负的,那么它不可能是最大子段的起点,因为任何包含a[i]为起点的子段都可以通过
         用a[i+1]为起点而得到改进。类似的,任何负的子段都不可能是最优子段的前缀(原理相同).
         如果在循环中检测到a[i]到a[j]的子段是负的,那么可以推进i.

结论:不仅能把i推进到i+1,而且可以一直推进到j+1.
原因:令p为i+1和j之间的任一下标。开始于下标p的任意子段都不大于从下标i开始并包含从a[i]到a[p-1]的子段,

        因为a[i]到a[p-1]这个子段不是负的(j是使得从下标i开始,其值成为负值序列的第一个下标)

 

算法实现:

public class MaxSum 
{
	public static int maxSubSum(int[] a)
	{
		int maxSum = 0;
		int thisSum = 0;

		for (int j = 0; j < a.length; j++)
		{
			thisSum += a[j];
			if (thisSum > maxSum)
			{
				maxSum = thisSum;
			}
			else if (thisSum < 0)
			{
				thisSum = 0;
			}
		}

		return maxSum;
	}
	public static void main(String[] args) 
	{
		int[] a = {-2, 11, -4, 13, -5, -2};
		System.out.println(MaxSum.maxSubSum(ar));
	}
}

算法的优点:

1)运行时间最短;

2)而且只对数据进行一次扫描,一旦a[i]被读入并被处理,它就不在需要被记忆;

3)在任何时刻,算法都能对已读入的数据给出该问题的正确答案;

分享到:
评论

相关推荐

    python求最大子段和(动态规划法)

    【问题描述】使用分治递归算法解最大子段和问题,具体来说就是,将序列分为长度相等的左右两段,分别求出这两段的最大子段和,包含左右部分子段的最大子段和,求这三种情况得到的最大子段和的最大值。 【输入形式】...

    最大子段和/三种方法/c++

    最大子段和/三种方法/c++语言/(内有报告) 蛮力法,动态规划法,分治法。 可比较时间,随机输入数据......

    算法设计实验报告-求最大子段和问题

    算法设计实验报告,包括:蛮力法、分治法和减治法求最大子段和问题各自的基本思想、时间复杂度分析,C++实现代码,三种算法运行时间的比较,运行截图,实验心得。

    python求最大子段和(分冶递归法)

    【问题描述】使用分治递归算法解最大子段和问题,具体来说就是,将序列分为长度相等的左右两段,分别求出这两段的最大子段和,包含左右部分子段的最大子段和,求这三种情况得到的最大子段和的最大值。 【输入形式】...

    最大子段和

    分别用三重循环,分治法和动态规划算法来解决最大子段和问题,并比较三个算法效率的差异。内含c++源代码和实验报告说明

    最大子段和问题的三种算法

    分别用蛮力法、分治法、动态规划法设计的最大子段和问题的算法。用VC++ 6.0运行。

    分治算法 最大子段和 MATLAB代码

    %divide——将数组分成两段 %conquer——每段分别求最大字段和 %combine——最大子段和无非三种情况:左端、右端、横跨中间 %每段分别求最大子段和的时候采用递归调用

    动态规划,数字三角形 最大子段和问题 最长公共子序列

    编程实现最大子段和问题的求解(分别采用分治法和动态规划法求解) 编程实现最长公共子序列(LCS)问题的求解 设计算法求解数字三角形问题,并编程实现。(P90算法实现题3-7)

    黑龙江大学《算法设计与分析》实验源码及实验报告

    实验一:分治算法的设计与实现(求最大子段和、找众数和重数) 实验二:动态规划算法的设计与实现(求最大子段和、求最长公共子序列) 实验三:贪心算法的设计与实现(求解背包问题、求解活动安排问题) 实验四:...

    最长子段问题

    输入数据第一行包含三个整数n(1≤n≤1000)、m(0≤m≤1000)和k(m≤k≤1000),接下去一行包含n个整数,整数大小在-1000到1000之间。 结果输出: 输出一行一个整数,即满足条件最大子段的长度。 输入示例 输出示例 5 0 ...

    JavaScript-HTML-css实现算法可视化

    1.用分治算法求解最大子段和问题。要求算法的时间复杂度不超过O(nlogn)。 2.给定含有n个元素的多重集合S,用分治法设计并实现在多重集合中找众数及其重数的算法。要求算法的时间复杂性在最坏情况下不超过O(nlogn)...

    实验3-动态规划算法1

    2.最大子段和问题,比较三重循环,分治法和动态规划算法的效果,测试数据:1) (-2,11,-4,13,-5,-2)2)过去大约三百年间,太阳黑子数的时间数据如

    ACM常用模板总结ACM常用模板总结

    几何\ 多边形 多边形切割 浮点函数 几何公式 面积 球面 三角形 三维几何 ... 最大子段和 最大子阵和 组合\ 排列组合生成 生成gray码 置换(polya) 字典序全排列 字典序组合 组合公式

    ACM经典、常用代码

    这是我整理过的关于ACM题目常用到的算法代码,word文档,条理清晰,绝对有用。目录如下: 一.数论 1.阶乘最后非零位 2. 模线性方程(组) 3. 素数表 4. 素数随机判定(miller_rabin...12. 最大子段和 13. 最大子阵和

    浙大算法包,几何 结构\数论\数值计算\图论_NP搜索\图论_连通性\图论_匹配\组合\

    这里汇集了浙江大学一些同学的算法,列表如下: 几何\ 多边形 多边形切割 浮点函数 ... 最大子段和 最大子阵和 组合\ 排列组合生成 生成gray码 置换(polya) 字典序全排列 字典序组合 组合公式

    ACM算法模板集锦(几何,结构,其他,数论,数值计算,图论)

    ICPC routine library maintained by WishingBone last update on Oct. 10th, 2004 ... 最大子段和 最大子阵和 组合\ 排列组合生成 生成gray码 置换(polya) 字典序全排列 字典序组合 组合公式

    浙江大学ACM模板(经典代码)

    1、 几何 25 1.1 注意 25 ...13.12 最大子段和 127 13.13 最大子阵和 127 14、 其它 128 14.1 大数(只能处理正数) 128 14.2 分数 134 14.3 矩阵 136 14.4 线性方程组 138 14.5 线性相关 140 14.6 日期 140

    数据结构的钻石版 acm 模版

    1、 几何 25 1.1 注意 25 ...13.12 最大子段和 127 13.13 最大子阵和 127 14、 其它 128 14.1 大数(只能处理正数) 128 14.2 分数 134 14.3 矩阵 136 14.4 线性方程组 138 14.5 线性相关 140 14.6 日期 140

    ACM常用算法代码 pdf

    目录 一.数论 4 1.阶乘最后非零位 4 2. 模线性方程(组) 4 3. 素数表 6 4. 素数随机判定(miller_rabin) 6 5. 质因数分解 7 6. 最大公约数欧拉函数 8 二....12. 最大子段和 122 13. 最大子阵和 123

    非常经典的acm程序代码

    非常经典的acm程序代码 目录 一.数论 4 1.阶乘最后非零位 4 2. 模线性方程(组) 4 3. 素数表 6 ...4. 素数随机判定(miller_rabin) 6 ...二....三....四....五....六....12. 最大子段和 122 13. 最大子阵和 123

Global site tag (gtag.js) - Google Analytics