算法实例(一) 最大子列和问题
作者:互联网
最大子列和问题
题目:
分析:求Ai到Aj这个连续的子列和的最大值,对于给定的N个整数,它拥有许多个连续的子列,如果子列的和为负数,我们就返回0.
针对这一问题我们拥有多种算法。
**
算法1:
:最直接,最暴力的方法:即将所有连续的子列的和找出来,在从中找出最大的一个。**
int MaxSubseqSum1(int A[],int N)
{
int ThisSum,MaxSum = 0;
int i,j,k;
for(i = 0;i < N;i++)//i是子列的左端
{
for(j = i;j < N ;j++)//j是子列的右端
{
ThisSum = 0;//ThisSum是子列A[i]到A[j]的子列和
for(k = i;k <= j; k++)
ThisSum += A[K];
if(ThisSum > MaxSum)//如果刚得到的这个子列和更大
MaxSum = ThisSum;//则更新结果
}//j循环结束
}//i循环结束
return MaxSum;
}
算法2
子列每往后加一位,算法1都重复做了一件事,那就是开头的和都重新加了一遍,这其实是多余的,于是就有了算法2,改善重加开头部分的过程。
int MaxSubseqSum1(int A[],int N)
{
int ThisSum,MaxSum = 0;
int i,j,k;
for(i = 0;i < N;i++)//i是子列的左端
{
ThisSum = 0;//ThisSum是子列A[i]到A[j]的子列和
for(j = i;j < N ;j++)//j是子列的右端
{
ThisSum += A[j];//对于相同的i,不同的j,只需要在j-1的循环基础上每次累加一项就可以了
if(ThisSum > MaxSum)//如果刚得到的这个子列和更大
MaxSum = ThisSum;//则更新结果
}//j循环结束
}//i循环结束
return MaxSum;
}
算法3
分而治之:将一个复杂的问题先分成许多小块问题,最后再将问题合并起来。
算法4
在线处理:
int MaxSubseqSum4( int A[], int N )
{ int ThisSum, MaxSum;
int i;
ThisSum = MaxSum = 0;
for( i = 0; i < N; i++ ) {
ThisSum += A[i]; /* 向右累加 */
if( ThisSum > MaxSum )
MaxSum = ThisSum; /* 发现更大和则更新当前结果 */
else if( ThisSum < 0 ) /* 如果当前子列和为负 */
ThisSum = 0; /* 则不可能使后面的部分和增大,抛弃之 */
}
return MaxSum;
}
标签:子列,int,++,算法,实例,ThisSum,MaxSum 来源: https://blog.csdn.net/m0_46518461/article/details/105251671