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

最大子段和(二)

阅读更多

最大子段和问题

 

解法二:分治法

算法分析:

最大子段和可能在三处出现。
1)整个出现在输入数据的左半部
2)整个出现在右半部。

3)跨越输入数据的中部从而位于左右两半部分之中
前两种情况可以递归求解,第三种情况的最大和可以通过求出前半部分的最大和(包含前半部分的最后一个元素)
以及后半部分的最大和(包含后半部分的第一个元素)而得到,前后两部分和相加。
三部分中的最大者,即为最大子段和.

例如:

前半部分        后半部分

4  -3  5  -2    -1  2  6  -2

其中前半部分的最大子段和为6(A1到A3),而后半部分的最大子段和为8(A6到A7);

前半部分包含其最后一个元素的最大和为4(A1到A4),后半部分包含其第一个元素的最大和为7(A5到A7),

则横跨这两部分的最大和为4+7=11;

故该序列的最大字段和为11

 

算法实现如下:

/*
 * description: 最大子段和
 * 分治策略
 * 最大子段和可能在三处出现。
 * 1)整个出现在输入数据的左半部
 * 2)整个出现在右半部。
 * 3)跨越输入数据的中部从而位于左右两半部分之中
 * 前两种情况可以递归求解,第三种情况的最大和可以通过求出前半部分的最大和(包含前半部分的最后一个元素)
 * 以及后半部分的最大和(包含后半部分的第一个元素)而得到,前后两部分和相加。
 * 三部分中的最大者,即为最大子段和.
 * auther: cm
 * date: 2010/11/20
 */
public class MaxSubSumRec 
{
	private static int maxSumRec(int[] a, int left, int right)
	{
		if (left == right)
		{
			if (a[left] > 0)
			{
				return a[left];
			}
			else
			{
				return 0;
			}
		}

		int center = (left + right) / 2;
		int maxLeftSum = maxSumRec(a, left, center);
		int maxRightSum = maxSumRec(a, center + 1, right);

		int maxLeftBorderSum = 0;
		int leftBorderSum = 0;
		for (int i = center; i >= left; i--)
		{
			leftBorderSum += a[i];
			if (leftBorderSum > maxLeftBorderSum)
			{
				maxLeftBorderSum = leftBorderSum;
			}
		}

		int maxRightBorderSum = 0;
		int rightBorderSum = 0;
		for (int i = center + 1; i <= right; i++)
		{
			rightBorderSum += a[i];
			if (rightBorderSum > maxRightBorderSum)
			{
				maxRightBorderSum = rightBorderSum;
			}
		}

		return max(maxLeftSum, maxRightSum, maxRightBorderSum + maxLeftBorderSum);
	}

	//入口程序
	public static int maxSubSum(int[] a)
	{
		return maxSumRec(a, 0, a.length - 1);
	}

	//求三数中的最大值
	private static int max(int a, int b, int c)
	{
		int max = a > b ? a : b;
		max = c > max ? c : max;

		return max;
	}

	public static void main(String[] args) 
	{
		int[] a = {-2, 11, -4, 13, -5, -2};
		System.out.println(MaxSubSumRec.maxSubSum(a));
	}
}
 
分享到:
评论

相关推荐

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

    虽然分治法通常不直接用于解决最大子段和问题,但在某些特定情况下,如处理二维数组时,可以结合分治策略优化问题。在一维数组上,分治法的优势并不明显,因为其时间复杂度仍为O(n^2),与蛮力法相当。然而,理解分治...

    用动态规划法求解最大子段和问题 C语言实现

    对于最大子段和问题,我们可以定义一个二维数组`dp`,其中`dp[i][j]`表示数组从索引`i`到`j`的最大子段和。对于单个元素,其最大子段和就是该元素本身,所以有`dp[i][i] = nums[i]`。如果相邻两个元素之和为正,则...

    最大子段和

    二是左半段的最大子段和与右半段的最大子段和不同;三是左半段的最大子段和跨越了中点。对于这些情况,我们可以使用递归方法来解决。 算法的时间复杂度为 O(nlogn),这是因为我们需要递归地计算左半段和右半段的...

    算法设计 C 最大子段和 动态规划法和分治法

    本文将深入探讨如何使用C语言实现最大子段和问题,以及如何运用动态规划法和分治法这两种高效策略来解决这一问题。 最大子段和(Maximum Subarray Problem)是计算数组中连续子数组的最大和的经典问题。在实际应用...

    最大子段和及其升级版

    对于二维最大子段和问题,我们需要在矩阵中找到一个矩形区域,使得该区域内元素之和最大。这通常可以通过预处理来加速计算,即将每个子矩阵的元素之和预存下来,以便快速查询。 #### 3.2 预处理方法 定义`sum[i][j...

    动态规划实例最大子段和 _动态规划_

    对于最大子段和问题,我们可以定义一个二维数组dp,其中dp[i]表示以第i个元素结尾的最大子段和。 以下是MATLAB中实现动态规划解决最大子段和的基本步骤: 1. 初始化:设置dp[0] = arr[0],即第一个元素本身是其...

    最大子段和(动态规划)

    最大子段和问题是一个经典的计算机科学问题,主要涉及动态规划这一算法设计策略。动态规划是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相互重叠的子问题来求解复杂问题的方法。在这个问题中,目标...

    最大子段和问题的动态规划求解

    最大子段和问题在计算机科学领域是一个经典的动态规划问题,主要应用于寻找一组数值中的最大连续子数组之和。这个问题在数据分析、信号处理、金融分析等多个领域都有广泛的应用。接下来,我们将深入探讨最大子段和...

    最大子段和问题程序源码

    最大子段和问题,是计算机科学中一个经典的线性时间复杂度的算法问题,它涉及到数组处理和动态规划。在给定的数组中,我们寻找一个连续子序列(子数组),使得这个子序列中的所有元素相加得到的和最大。这个问题在...

    求出最大子段和,并输出起始位置(maxsum)

    在编程领域,最大子段和问题是一个经典的算法问题,它要求在给定的整数数组中找到连续子数组,使得其元素之和最大。这个问题在实际应用中有着广泛的应用,例如在金融分析、数据挖掘等领域。本文将详细介绍如何解决这...

    最大子段和最大子矩阵 最大子长方体

    "最大子段和最大子矩阵最大子长方体" 本文主要讲述了动态规划(DP)在解决最大子段和、最大子矩阵和最大子长方体问题中的应用。这些问题都是DP模型的变形,通过适当的转化和预处理,可以将高维问题转化为一维的基本...

    动态规划算法解决最大子段和和电路布线

    `max_current`表示到当前位置为止的最大子段和,而`max_global`则记录全局最大子段和。遍历数组时,每次更新这两个值,如果当前元素加上`max_current`大于当前元素本身,那么意味着当前元素应该包含在连续子段中,...

    最大子段和简介.pdf

    ### 最大子段和简介 #### 一、概念解析 最大子段和(Maximum Subarray Sum)是指在一个给定的数组中寻找一个连续的子数组(子段),使得该子数组的所有元素之和达到最大值。这是一个经典的计算机科学问题,在算法...

    蛮力法分治法动态规划法求最大子段和

    在IT领域,尤其是在算法设计与分析中,求解最大子段和问题是一个经典的问题,它不仅考验了程序员的基础算法知识,还涉及到了多种算法思想的应用,包括蛮力法、分治法以及动态规划法。下面将针对这三种方法进行详细的...

    text(动态规划之最大子段和)

    在这个问题中,我们可以定义一个二维数组dp[i][j]来表示数组从索引i到j的最大子段和,然后逐步更新dp数组,最终得到整个数组的最大子段和。 接下来,我们分析最大子段和的算法。Kadane's Algorithm 是解决这个问题...

    最大子段和详解.docx

    ### 最大子段和详解 #### 一、问题概述与定义 最大子段和问题(Maximum Interval Sum),也常被称为LIS(Longest Increasing Subsequence)问题中的一个变种,实际上这里的LIS指的是最大子段和问题本身。该问题是...

    最大子段和问题.zip

    最大子段和问题,也被称为最大连续子序列和问题,是计算机科学中一个经典的问题,主要涉及算法设计和分析,特别是在动态规划领域的应用。这个问题要求找出一个数组中的连续子序列,使得该子序列的和最大,并返回这个...

    最大m子段和各个下标的计算方法(含代码)

    该问题的推广形式可以在最大子段和问题的基础上进行分析,最大子段和问题是指在序列中找出一个连续的子序列,使得子序列的元素之和最大。 动态规划算法在处理这类问题时显示出了明显的优势,尤其是在子问题之间存在...

Global site tag (gtag.js) - Google Analytics