求最长连续子表和

41 阅读1分钟
求最长连续子表和

输入若干个整型数据(可能有正数和负数),存放在顺序表中,求顺序表中连续子表(最少有一个元素)的最大和。

0 2 -1 3 -5 输出4 ( = 2-1+3)

1 5 5 -7 9 4 输出17 ( = 1+5+5-7+9+4)

方法

动态规划

分析

设置current_sum代表当前连续子表和, max_sum表示全局最大和。依次判断当前元素是加入子表和计算,还是以当前元素为起点重新计算子表和。

关键代码

current_sum = current_sum > 0 ? current_sum + 元素 : 元素

判断当前连续子表和是否为正,若为正数说明当前子表和对后续元素有正向贡献,可继续累加,

若为负数,则选择以当前元素为新的起点重新累加。

  if (current_sum > max_sum) {
         max_sum = current_sum;
     }

在每次动态调整 “当前子表和” 后,及时用全局变量保存历史最大和,避免因后续子表和变小而丢失正确结果

完整代码
 int seqMaxSum(PseqList plist)
 {
     int i;
     int max_sum = plist->element[0];
     int current_sum = plist->element[0];       //plist->element元素数组
     for(i = 1; i < plist->curNum ;i++ ){       // plist->curNum为顺序表中的元素个数
         current_sum = current_sum > 0 ? current_sum + plist->element[i] : plist->element[i];
          if (current_sum > max_sum) {
             max_sum = current_sum;
         }
     }
 ​
     printf("%d",max_sum);
     return max_sum;
 }