数据结构之多项式最大子列和问题(学习笔记)
问题描述:
给定N个整数的序列{a1,a2,...,an},求函数 的最大值
问题解决:
1.正规的遍历
int MaxSubseqSum1( int A[], intN )
{
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;
} // T( N) = O( N3 )
2.分而治之
3.在线处理
int MaxSubseqSum4( int A[], intN )
{
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;
} T( N) = O( N)
- “在线”的意思是指每输入一个数据就进行即时处理,在任何一个地方中止输入,算法都能正确给出当前的解。