算法1:三重循环暴力求解法
#include <stdio.h>
int maximum_segment_sum(int array[],int n)
{
int this_sum = 0;
int max_sum = 0;
int i,j,k;
for(i = 0;i < n;i++)
{//分别以第一个第二个元素开始
for(j = i;j < n;j++)
{//不停的在这个串上多加几个元素
this_sum = 0;
for(k = i;k <= j;k++)
{//遍历求和
this_sum += array[k];
}
if(this_sum > max_sum)
{
max_sum = this_sum;
}
}
}
return max_sum;
}
int main() {
int array[7] = {1,-5,3,4,-2,-3,10};
int result = 0;
result = maximum_segment_sum(array,7);
printf("%d",result);
return 0;
}
算法2:二重循环求解
#include <stdio.h>
int maximum_segment_sum(int array[],int n)
{
int this_sum = 0;
int max_sum = 0;
int i,j,k;
for(i = 0;i < n;i++)
{
this_sum = 0;
for(j = i;j < n;j++)
{
this_sum += array[j];
if(this_sum > max_sum)
{
max_sum = this_sum;
}
}
}
return max_sum;
}
int main() {
int array[7] = {1,-5,3,4,-2,-3,10};
int result = 0;
result = maximum_segment_sum(array,7);
printf("%d",result);
return 0;
}
算法3:分治法
最关键的两个问题是:
我们要维护区间的哪些信息呢?lsum rsum msum isum
我们如何合并这些信息呢?通过pushup函数
#include <stdio.h>
/*结构体,里面包含一个字段的最重要的信息*/
struct Status
{
int lsum;//lsum为左字段的最大和
int rsum;//rsum为右子段的最大和
int msum;//msum为该段的最大和
int isum;//isum为该段的和
};
/*两个数求最大函数*/
int fmax(int a,int b)
{
if(a >= b)
{
return a;
}
else if(b > a)
{
return b;
}
}
/*上升操作*/
struct Status push_up(struct Status l,struct Status r)
{ //其中 lr分别为左右子段
int isum = l.isum + r.isum;
int lsum = fmax(l.lsum,l.isum + r.lsum);
int rsum = fmax(r.rsum,r.isum + l.rsum);
int msum = fmax(fmax(l.msum,r.msum),l.rsum+r.lsum);//看是否需要跨越中间,如果跨越一定说明左子段的rsum+右子段的lsum是最大的
return (struct Status){lsum,rsum,msum,isum};
}
/*获取左边最大右边最大的信息*/
struct Status getnum(int array[] ,int left,int right)
{
int middle = (left + right)/2;
if(left == right)
return (struct Status){array[left],array[left],array[left],array[left]};
struct Status lsub = getnum(array,left,middle);//分别获取左右子段的信息
struct Status rsub = getnum(array,middle + 1,right);
return push_up(lsub,rsub);//相当于分治算法中的合成步骤
}
/*求最大字段和函数*/
int max_array(int array[],int left,int right)
{
return getnum(array,left,right).msum;
}
int main()
{
int array[7] = {1,-5,3,4,-2,-3,10};
int result = 0;
result = max_array(array,0,6);
printf("%d",result);
}