最大相连子序列和
题目:最大的子序列和问题,给定(可能有负数)整数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),在任意时刻算法都能对已经读入的数据给出子序列问题的正确答案,这种仅需要常量空间并以线性时间运行的联机算法几乎是完美的算法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!