方法1
思想:通过三个嵌套循环来进行求解,通过前两个循环逐渐限制第三个循环开始结束位置。从而遍历所有子列。
代码思路:第一个循环用来遍历所有的数字从而用来限制第三个循环的开始坐标,第二个循环用来限制第三个循环结束的坐标。我们通过将每个小子列与当前最大子列相比较取较大值。
#include<stdio.h>
int MaxsubquenceSum(int a[],int n)
{
int Thisum,maxsum,i,j,k;
maxsum=0;//最大的
for(int i=0;i<n;i++)
{
for(int j=i;j<n;j++)
{
Thisum=0;//当前之和 每次新的第几次开始都有将其归零
//比如第一次是从4开始一直往后
//第二次则是从-3开始因而需要清零
for(int k=i;k<=j;k++)
{
Thisum=Thisum+a[k];
if(Thisum>maxsum)
{
maxsum=Thisum;
}
}
}
}
return maxsum;
}
int main()
{
int a[8]={4,-3,5,-2,-1,2,6,-2};
int max=MaxsubquenceSum(a,8);
printf("%d",max);
return 0;
}
时间复杂度为O(n^3)
方法2
思想:通过两个嵌套循环来进行求解,通过第一个约束开始位置,第二个循环从开始往后循环。
代码思路:第一个约束开始位置,第二个循环从开始位置往后循环。并进行求和与最大值相比取较大。
#include<stdio.h>
int MaxsubquenceSum(int a[],int n)
{
int Thisum,maxsum,i,j;
maxsum=0;
for(int i=0;i<n;i++)
{
Thisum=0;
for(int j=i;j<n;j++)
{
Thisum+=a[j];
if(Thisum>maxsum)
{
maxsum=Thisum;
}
}
}
return maxsum;
}
int main()
{
int a[8]={4,-3,5,-2,-1,2,6,-2};
int max=MaxsubquenceSum(a,8);
printf("%d",max);
return 0;
}
时间复杂度为O(n^2)