算法实例(一) 最大子列和问题

最大子列和问题

题目:在这里插入图片描述
分析:求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;  
}
发布了2 篇原创文章 · 获赞 15 · 访问量 146

猜你喜欢

转载自blog.csdn.net/m0_46518461/article/details/105251671
今日推荐