求最长连续子表和
输入若干个整型数据(可能有正数和负数),存放在顺序表中,求顺序表中连续子表(最少有一个元素)的最大和。
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;
}