《算法导论》第三版讲分治时引用了一个很好的例子,股票的涨幅。
而其本质是与《数据结构与算法分析》的开篇一样的,最大子序列和问题。
问题描述:已知每天股票的价格,选择一个买入点和一个抛出点,使得获取利润最大。
问题转换:一个整数序列 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 请按任意键继续. . .
在编程领域,最大子序列和问题(Max Subarray Problem)是一个经典的动态规划问题,它要求在给定的一组整数序列中找到具有最大和的连续子序列。这个问题在实际应用中有着广泛的意义,例如在金融分析、数据分析等领域...
本资料包“C++算法-最大子序列和.zip”聚焦于C++实现的一种经典算法——最大子序列和(Maximum Subarray Problem),这在数据结构与算法的学习中是非常关键的一环。 最大子序列和问题是一个寻找一串数组中具有最大...
利用C/C++语言解决最大子列和问题,在线处理-超简单的算法
### 最大子序列和问题详解 #### 一、引言 最大子序列和问题是一个经典的计算机科学问题,涉及在一串整数(其中可能包括负数)中找到具有最大和的连续子序列。此问题不仅在理论研究中有重要意义,在实际应用如生物...
最大子序列和问题,一个整形数组序列求一个不变顺序的相加最大和子序列。
最大子序列和问题(Maximum Subarray Sum Problem)是求解一个数组中连续子数组的和的最大值的问题。
动态规划是解决最大子序列和问题的最优算法之一。其核心思想是利用已计算出的子问题结果,避免重复计算,从而达到优化算法的目的。在这个问题中,我们可以通过维护一个变量,用来存储当前子序列的最大和,每当遇到新...
C 最大子序列问题的几中算法-分治-联机算法
动态规划算法:最大子序列问题
例如,注释提到的“最大子序列问题”,实际上在代码中似乎是在计算连续子序列的和,而不是找出最大子序列本身。此外,代码中有些地方语法不完整,可能是因为扫描错误,例如`intsum=0;for(i=0;i;i++){}mostEle(num);`...
最大子序列问题算法分析 最大子序列问题是计算机科学中的一种经典问题,旨在寻找给定整数序列中最大子序列的和。该问题可以使用多种算法来解决,包括穷举法、递归法等。在本文中,我们将对最大子序列问题的算法进行...
最大子序列和问题是一维数组中最长的连续子序列,使得子序列的和最大。最大子矩阵和问题是在二维矩阵中找到一个矩形区域,其内部元素之和最大。 1. **最大子序列和算法**: 在动态规划方法中,我们通常使用Kadane'...
这个问题是经典的计算机科学问题,也被称为“最大子序列和问题”(Maximum Subarray Problem),最早由著名计算机科学家Dijkstra提出。 解决这个问题的一个经典算法是 Kadane's Algorithm,但这里我们关注的是分治...
最大子序列问题是一种经典的算法问题,它涉及到对一维数组中的连续子序列进行求和,目标是找到和最大的那个子序列。在这个问题中,我们通常使用动态规划的思想来解决。以下是对最大子序列求和算法的详细解释: 1. *...
**最大字段和问题**,也被称为**最大子序列和问题**,是指在给定的一组数字中找到一个连续子序列(或子数组),使得这个子序列的和最大。这个问题在实际应用中非常常见,比如在金融数据分析中寻找收益最大的投资组合...
最大子段和问题是指给定一个由 n 个整数(可能有负整数)组成的序列(a1, a2, …, an),求该序列中的最大子段和。 知识点: 1. Maximum Subarray Problem:最大子段和问题是指给定一个由 n 个整数(可能有负整数...
最大子序列和问题是一种经典的动态规划问题,它可以通过使用动态规划算法来解决。 最大子序列和问题可以描述为:给定一个序列{ N1, N2, ..., NK },找到其中的最大连续子序列,使其元素和最大。例如,给定序列{ -2,...