竹杖_

最大相连子序列和

题目:最大的子序列和问题,给定(可能有负数)整数A1,A2,…,An,求∑Ak的最大值。

法一:最大相连子序列和的平方级算法

int maxSubSum(const std::vector<int>& a) {
int maxSum = 0;
for (int i = 0; i < a.size(); ++i) {
int thisSum = 0;
for (int j = i; j < a.size(); ++j) {
thisSum += a[j];
if (maxSum < thisSum)maxSum = thisSum;
}
}
return maxSum;
}

法二:分治策略

相连最大子序列和的递归算法,找出生成[left…right]的子数组中的最大和,不保留具体的最佳序列。

int maxSubSum(const std::vector<int>&a, int left, int right) {
if (left == right) { //基准情形,数组中只有一个元素时,大于0返回本身,小于0则返回0
if (a[left] > 0)
return a[left];
else
return 0;
}
int mid = (left + right) / 2;
int maxLeftSum = maxSubSum(a, left, mid);
int maxRightSum = maxSubSum(a, mid+1, right);
int maxLeftBorderSum = 0, maxRightBorderSum = 0; //以中点为起点的左右最大连续子序列和
int leftBorderSum = 0, rightBorderSum = 0; //以中点为起点的左右相连子序列和
for (int i = mid; i >= left; --i)
{
leftBorderSum += a[i];
if (leftBorderSum > maxLeftBorderSum)
maxLeftBorderSum = leftBorderSum;
}
for (int i = mid; i <= right; ++i) {
rightBorderSum += a[i];
if (rightBorderSum > maxRightBorderSum)
maxRightBorderSum = rightBorderSum;
}
int temp = max(maxLeftSum, maxRightSum);
return max(temp, maxLeftBorderSum + rightBorderSum);
}

法三:联机算法,线性时间最大相连子序列和算法

int maxSubSum3(const std::vector<int>&a)
{
int maxSum = 0, thisSum = 0;
for (int i = 0; i < a.size(); ++i) {
thisSum += a[i];
if (thisSum > maxSum)
maxSum = thisSum;
if (thisSum < 0)
thisSum = 0;
}
return maxSum;
}

提示:联机算法(on-line algorithm),在任意时刻算法都能对已经读入的数据给出子序列问题的正确答案,这种仅需要常量空间并以线性时间运行的联机算法几乎是完美的算法。

posted @   aw11  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示