#include<iostream.h>
#define sum 21
int b[sum]; //算法1
int MAX_SUM(int a[])
{
int max,i,j,k,k1;
k1=0;
for(i=0;i<=5;i++) //进行3重循环,计算出所有可能的子段和
{
for(j=i;j<=5;j++)
{
for( k=i;k<=j;k++)
{
b[k1]+=a[k];
}
if(b[k1]<0)
b[k1]=0;
k1++;
}
}
max=b[0];
for(k1=1;k1<sum;k1++) //求出数组b中的最大值,即为所求的最大子段和
if(max<b[k1])
max=b[k1];
return max;
} //算法2
int MAX_SUM(int a[])
{
int k=0,max;
for(int i=0;i<=5;i++) //进行2重循环计算可能的最大子段和,存于辅助数组b中
{
for(int j=i;j<=5;j++)
{
if(i==j)
b[k]=a[j];
else
b[k]=b[k-1]+a[j]; //利用前k-1个已计算出的最大子段和求k个的最大子段和
if(b[k]<0)
b[k]=0;
k++;
}
max=b[0];
for(k=1;k<sum;k++) //求出数组b中的最大值,即为所求的最大子段和
if(max<b[k])
max=b[k];
return max;
}
} //算法3
int MAX_SUM(int a[], int left, int right)
{
int leftsum,rightsum,center,s1,s2,lefts,rights,s;
if (left==right) //当left==right时,直接计算最大子段和
{if (a[left]>0)
return a[left];
else return 0;}
else
{
center=(left+right)/2;
leftsum=MAX_SUM(a,left,center); //否则计算当前子段[1..n/2]的最大子段
rightsum=MAX_SUM(a,center+1,right); //否则计算当前子段[n/2+1..n]的最大子段
}
s1=0;lefts=0;
for(int i=center;i>=left;i--) //计算前半段子段和
{
lefts+=a[i];
if(lefts>s1) //如果子段和小于0,记为0
s1=lefts;
}
s2=rights=0;
for(int j=center+1;j<=right;j++) //计算后半段子段和
{
rights+=a[j];
if(rights>s2)
s2=rights;
}
s=s1+s2; //计算跨越2子段的子段和s
if(s>leftsum) //前半段leftsum,后半段rightsum,和s的大小,最大者即是
// 当前段的最大子段和
{
if(s>rightsum)
return s;
else
return rightsum;
}
else
{
if(leftsum>rights)
return leftsum;
else
return rightsum;
}
}
//算法4
int MAX_SUM(int a[]) //根据推导b[j]等于a[0..j]的最大子段和
{
int temp,max;
int b[6]; //辅助数组b,存储b[1..5]的各个子段和
for(int j=0;j<=6;j++)
{
if(j==0)
b1[j]=0; //b[0]定为不包含任何元素的子段,显然它为0
else
{
temp=b1[j-1]+a[j-1]; //计算b[j]的值。b[j]将等于b[j-1]和a[j]中较大的那个
if(temp<a[j-1])
b1[j]=a[j-1];
else
b1[j]=temp;
}
}
max=b1[1];
for(j=2;j<=6;j++) //计算b[1..6]的最大值,即为所求的最大子段和
{
if(max<b1[j])
max=b1[j];
}
return max;
}
//算法5,其实用代码实现并不难,难的是思想。
int MAX_SUM(int a[],int i,int j)
{
int k,s1,l,temp; //s1用来存储当前子段的s[i,l-1]的最大子段和
s1=0;temp=0; //temp用来与s1比较,判断是否此时的s1是最大子段
for(l=i;l<=j;l++)
{
temp=temp+a[l];
if(temp>=s1)
s1=temp;
else
if(temp<=0) //当temp小于等于0,找到l的值,跳出循环
{
break;
}
}
if(l>=j) //如果l等于j,或者l等于j+1,则s[i,l-1]的最大子
// 段s1就是s[i,j]的最大子段和
return s1;
if(l==i) //如果l等于i,则最大子段在s[i+1,j],递归计算。
// 问题规模减少1。
return MAX_SUM(a,l+1,j);
else //如果i
//间更大的那个。其中s[i,l-1]的最大子段就是s1
return MAX(s1,MAX_SUM(a,l+1,j));
}
|