1、暴力破解法(直接法)
int MaxSubsequenceSum(const int A[], int N)
{
int MaxSum, ThisSum, i, j, k;
MaxSum = 0;//初始化最大子列和
for (int i = 0; i < N; ++i)//i是子列左端位置
{
for (int j = i; j < N; ++j)//j是子列右端位置
{
ThisSum = 0;
for (int k = i; k <= j; ++k)//计算A[i]到A[j]的子列和
{
ThisSum += A[k];
}
if (ThisSum>MaxSum)//如果新的子列和更大,则更新子列和
MaxSum = ThisSum;
}
}
return MaxSum;
}
时间复杂度O(N3)
2、对直接法的优化
int MaxSubsequenceSum(const int A[], int N)
{
int MaxSum, ThisSum, i, j;
MaxSum = 0;//初始化最大子列和
for (int i = 0; i < N; ++i)//i是子列左端位置
{
ThisSum = 0;//ThisSum是从A[i]到A[j]的子列和
for (int j = i; j < N; ++j)
{
ThisSum += A[j];//对于相同的i不同的j,只需要在原来的基础上累加一项即可
if (ThisSum>MaxSum)
MaxSum = ThisSum;
}
}
return MaxSum;
}
时间复杂度O(N2)
3、分治法
时间复杂度O(NlogN)
4、“在线”算法
- 思想:如果整数序列{a1,a2,...an}的最大子列和为{ai,ai+1,...aj},则对任意的i<l<j,ai到aj的和都大于等于0;一旦发现当前子列为负,则可以考虑换一个新的子列。
- 代码:
int MaxSubsequenceSum(const int A[], int N) { int MaxSum, ThisSum, i; MaxSum = 0;//初始化最大子列和 ThisSum = 0; for (int i = 0; i < N; ++i) { ThisSum += A[i]; if (ThisSum>MaxSum) MaxSum = ThisSum; else if (ThisSum < 0) ThisSum = 0; } return MaxSum; }
- 时间复杂度O(N)