`
hypercube1024
  • 浏览: 85298 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

求连续最大和

 
阅读更多
求数组中连续区间的和最大,并且打印该区间的下标。
最容易想到的是穷举法,和分治法。后来网上搜了一下发现动态规划来解决这个问题非常优雅,下面是动态规划法解决该问题的代码
/**
	 * 连续最大和问题,动态规划法
	 * 
	 * @param a
	 */
	public static void maxSubSequence(int[] a) {
		int curSum = 0;
		int maxSum = a[0];
		int start = 0, end = 0;
		int tempStart = 0;
		for (int i = 0; i < a.length; i++) {
			if (curSum == 0)
				tempStart = i;

			curSum += a[i];
			if (curSum > maxSum) {
				maxSum = curSum;
				end = i;
				start = maxSum < 0 ? end : tempStart;
			}

			if (curSum < 0)
				curSum = 0;

		}
		System.out.println("maxSum:" + maxSum + "\tstart:" + start + "\tend:"
				+ end);
	}

	public static double random(int start, int end) {
		return Math.ceil(Math.random() * (end - start) + start);
	}

	public static void main(String[] args) {
		int[] a = { 90, 9, 0, -7, 29, 7, -99, -72, 40, 63, 96, -92, 25, -53,
				-49, -6, -7, -37, 29, 39 };
		int[] b = { -3, -3, -1, -4, -7, -3, -1, -5 };
		maxSubSequence(a);
		maxSubSequence(b);

		// int start = -100;
		// int end = 100;
		// int[] arr = new int[20];
		// for (int i = 0; i < arr.length; i++) {
		// arr[i] = (int) random(start, end);
		// }
		// System.out.println(ArrayUtils.toString(arr));
		// maxSubSequence(arr);
	}
分享到:
评论

相关推荐

    最高效求连续最大和

    用java做的求最大连续和,时间复杂度为O(n)输入的处理函数 input(a)可以作为以后处理java输入的模版

    求连续的最大和,最小和

    求整型数组中连续最大和与最小和额程序,使用的是动态规划法。

    计算机算法分析与设计最大连续子序列

    输出对每个测试用例,在 1 行里输出最大和、最大连续子序列的第一个和最后一个元素,中间用空格分隔。如果最大连续子序列不唯一,则输出序号 i 和 j 最小的那个。 解决该问题的算法思路是使用动态规划法。首先,...

    求一段连续数的最大和

    请问,-41,59,26,-53,68,97,-93,-23,83九个数。SUM(N,M)表示从第N个数到到第M个数的和。例如:SUM(1,2)=-41+59=18。问:最大的和是多少?对应的N和M是多少?

    最大连续子序列和

    我们可以将数组分成左半部分和右半部分,然后计算这两部分中的最大连续子序列和,最后求出总的最大值。代码实现如下: ```cpp int maxsequence2(int a[], int l, int u) { if (l &gt; u) return 0; if (l == u) ...

    3种方法求 最大连续子序列和

    解法1—O(N^2)解法 解法2—O(NlgN)解法 解法3—O(N)解法 可以直接在记事本运行

    C++求最大子序列的和

    C++求最大子序列的和 问题:求一个数组 / 序列的满足条件的子数组 / 子序列。 条件: 1. 子数组必须是连续的。 2. 求和即可,不需要返回子数组是哪段。 3. 数组元素为整数。

    连续整数检测法分解质因数法求最大公约数

    根据提供的文件信息,我们可以归纳出三个主要的知识点:利用连续整数检测法分解质因数求最大公约数、使用欧几里得算法求最大公约数以及字符串匹配算法(包括BF、KMP和BM算法)。接下来将对这些知识点进行详细的解释...

    分治法求最大字段和问题——C语言代码

    总的来说,分治法求最大字段和问题展示了分治法如何在实际问题中发挥作用,通过分解问题、解决子问题、合并结果这三个步骤,巧妙地解决了二维数组的最大连续和问题。对于初学者来说,这是一个很好的练习,不仅可以...

    连续子序列最大和与乘积问题的分析

    在IT领域,特别是算法设计和分析中,"连续子序列最大和与乘积问题"是一个经典的话题。这类问题经常出现在数据结构和算法的面试中,也是优化和解决复杂计算问题的关键。本文将深入探讨这个问题,并结合提供的Java源码...

    求最大公约数

    连续整数检测法求最大公约数算法步骤 - 输入两个正整数m和n。 - 初始化t为较小的那个数。 - 从t开始向下递减直到1。 - 检查t是否能同时被m和n整除: - 如果不能,则继续递减t; - 如果可以,则输出t并结束程序。 ...

    求最大连续子数组.cpp

    求最大连续子数组.cpp

    C语言求连续最大子数组和的方法

    求连续最大子数组和的问题在实际应用中非常有用,例如在分析股票价格时找出连续一段时间内收益率最高的组合,或者在处理有噪声的数据时找到一段最接近理想状态的连续序列。 4. **优化和变体**: 虽然Kadane算法...

    python如何求数组连续最大和的示例代码

    【Python求解数组连续最大和】 在编程中,经常遇到寻找数组中连续子数组最大和的问题,这是一个经典的算法问题,通常可以通过不同的方法解决。在Python中,有几种常见的策略,包括蛮力法、利用已计算子数组和以及...

    Oracle计算连续天数,计算连续时间,Oracle连续天数统计

    这个查询会找出每个员工连续出勤的开始日期和结束日期,以及连续的天数。 3. **窗口函数** 另一种方法是利用窗口函数,如`LAG`和`LEAD`。这些函数可以查看当前行的前一行或后一行数据,非常适合检测连续性。例如:...

    用c++求两个数最大公约数

    本主题将深入探讨两种C++实现最大公约数的算法:辗转相除法(也称为欧几里得算法)和连续整数检测法(也称更相减损术),并比较它们的时间复杂度。 **辗转相除法**,是古希腊数学家欧几里得提出的一种高效算法。该...

    python求最大连续子数组的和

    对于求最大连续子数组和的问题,我们可以维护一个变量`pre_sum`,表示到当前元素为止的最大子数组和,同时还有一个`max_sum`变量,用来记录全局的最大和。遍历数组时,如果`pre_sum`小于0,说明之前的子数组对当前子...

    算法实验-串匹配问题-采用分治法求解最大连续子序列和问题-用分治策略求众数问题-最近点对问题

    在本实验中,我们将探讨四个核心的算法问题:串匹配问题、最大连续子序列和问题、求众数问题以及最近点对问题。这些问题都属于算法设计与分析的范畴,通过解决这些问题,我们可以深入理解分治法和其他算法策略。 1....

Global site tag (gtag.js) - Google Analytics