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

最大子序列和

阅读更多
《算法导论》第三版讲分治时引用了一个很好的例子,股票的涨幅。
而其本质是与《数据结构与算法分析》的开篇一样的,最大子序列和问题。

问题描述:已知每天股票的价格,选择一个买入点和一个抛出点,使得获取利润最大。

问题转换:一个整数序列 A[N](可能有负),求 A[i] 加到 A[j] 的最大值(0 <= i <= j < N)。如果所有整数均为负数,那么最大子序列和为0。
数组A表示的就是今天股票与昨天的差价。

一、首先会想到,可以用两个循环搞定,O(n^2)。

二、分治,O(nlogn),copy一下
int maxSubsequenceSum(int A[], int left, int right)
{
	int maxLeftSum, maxRightSum;
	int maxLeftBorderSum, maxRightBorderSum;
	int leftBorderSum, rightBorderSum;
	int mid, i;
	
	if (left == right)	// base case
		if (A[left] > 0)
			return A[left];
		else
			return 0;
	
	mid = (left + right)/2;
	maxLeftSum = maxSubsequenceSum(A, left, mid);
	maxRightSum = maxSubsequenceSum(A, mid+1, right);
	
	maxLeftBorderSum = leftBorderSum = 0;
	for (i = mid; i >= left; i--) {
		leftBorderSum += A[i];
		if (leftBorderSum > maxLeftBorderSum)
			maxLeftBorderSum = leftBorderSum;
	}
	
	maxRightBorderSum = rightBorderSum = 0;
	for (i = mid + 1; i <= right; i++) {
		rightBorderSum += A[i];
		if (rightBorderSum > maxRightBorderSum)
			maxRightBorderSum = rightBorderSum;
	}
	
	return max3(maxLeftSum, maxRightSum, maxLeftBorderSum + maxRightBorderSum);
}

三、Aha!灵机一动,O(n)
int maxSubsequenceSum(int A[], int left, int right)
{
	int thisSum, maxSum, i;
	
	thisSum = maxSum = 0;
	for (i = left; i <= right; i++) {
		thisSum += A[i];
		
		if (thisSum < 0)
			thisSum = 0;
		else if (thisSum > maxSum)
			maxSum = thisSum;
	}
	return maxSum;
}
分享到:
评论

相关推荐

    最大子序列和问题求解源代码

    2010.09.07 用分治法求解最大子序列问题。...《数据结构与算法分析 C++描述》p42最大子序列问题的递归方法代码 2010.09.07 vector a的内容: 4 -3 5 -2 -1 2 6 -2 最大子序列和是:11 请按任意键继续. . .

    最大子序列之和C++实现常数时间

    在编程领域,最大子序列和问题(Max Subarray Problem)是一个经典的动态规划问题,它要求在给定的一组整数序列中找到具有最大和的连续子序列。这个问题在实际应用中有着广泛的意义,例如在金融分析、数据分析等领域...

    C++算法-最大子序列和.zip

    本资料包“C++算法-最大子序列和.zip”聚焦于C++实现的一种经典算法——最大子序列和(Maximum Subarray Problem),这在数据结构与算法的学习中是非常关键的一环。 最大子序列和问题是一个寻找一串数组中具有最大...

    c/c++解决最大子序列和问题

    利用C/C++语言解决最大子列和问题,在线处理-超简单的算法

    最大子序列和问题的求解.md

    ### 最大子序列和问题详解 #### 一、引言 最大子序列和问题是一个经典的计算机科学问题,涉及在一串整数(其中可能包括负数)中找到具有最大和的连续子序列。此问题不仅在理论研究中有重要意义,在实际应用如生物...

    最大子序列和MAX-SUM

    最大子序列和问题,一个整形数组序列求一个不变顺序的相加最大和子序列。

    最大子序列和问题 C++ 代码实现

    最大子序列和问题(Maximum Subarray Sum Problem)是求解一个数组中连续子数组的和的最大值的问题。

    最大子序列求和最大子序列求和

    动态规划是解决最大子序列和问题的最优算法之一。其核心思想是利用已计算出的子问题结果,避免重复计算,从而达到优化算法的目的。在这个问题中,我们可以通过维护一个变量,用来存储当前子序列的最大和,每当遇到新...

    C 最大子序列算法

    C 最大子序列问题的几中算法-分治-联机算法

    动态规划算法:最大子序列问题

    动态规划算法:最大子序列问题

    最大子序列.pdf

    例如,注释提到的“最大子序列问题”,实际上在代码中似乎是在计算连续子序列的和,而不是找出最大子序列本身。此外,代码中有些地方语法不完整,可能是因为扫描错误,例如`intsum=0;for(i=0;i;i++){}mostEle(num);`...

    最大子序列问题算法分析.doc

    最大子序列问题算法分析 最大子序列问题是计算机科学中的一种经典问题,旨在寻找给定整数序列中最大子序列的和。该问题可以使用多种算法来解决,包括穷举法、递归法等。在本文中,我们将对最大子序列问题的算法进行...

    西南交通大学-算法分析与设计-实验5.4实验报告包含预习部分-求最大子序列-求最大子矩阵

    最大子序列和问题是一维数组中最长的连续子序列,使得子序列的和最大。最大子矩阵和问题是在二维矩阵中找到一个矩形区域,其内部元素之和最大。 1. **最大子序列和算法**: 在动态规划方法中,我们通常使用Kadane'...

    分治法求最大子数组以及其对应的下标.rar_well4fw_分治法_分治法求下标

    这个问题是经典的计算机科学问题,也被称为“最大子序列和问题”(Maximum Subarray Problem),最早由著名计算机科学家Dijkstra提出。 解决这个问题的一个经典算法是 Kadane's Algorithm,但这里我们关注的是分治...

    最大子序列算法[整理].pdf

    最大子序列问题是一种经典的算法问题,它涉及到对一维数组中的连续子序列进行求和,目标是找到和最大的那个子序列。在这个问题中,我们通常使用动态规划的思想来解决。以下是对最大子序列求和算法的详细解释: 1. *...

    最大字段和问题 分治法.cpp.rar

    **最大字段和问题**,也被称为**最大子序列和问题**,是指在给定的一组数字中找到一个连续子序列(或子数组),使得这个子序列的和最大。这个问题在实际应用中非常常见,比如在金融数据分析中寻找收益最大的投资组合...

    最大子段和(分治法)源码

    最大子段和问题是指给定一个由 n 个整数(可能有负整数)组成的序列(a1, a2, …, an),求该序列中的最大子段和。 知识点: 1. Maximum Subarray Problem:最大子段和问题是指给定一个由 n 个整数(可能有负整数...

    动态规划最大子序列和 Gabe

    最大子序列和问题是一种经典的动态规划问题,它可以通过使用动态规划算法来解决。 最大子序列和问题可以描述为:给定一个序列{ N1, N2, ..., NK },找到其中的最大连续子序列,使其元素和最大。例如,给定序列{ -2,...

Global site tag (gtag.js) - Google Analytics