最大子列和的四种算法及其时间复杂度分析
题目描述:
给定 n n n个整数序列,{ A 1 , A 2 , ⋯ , A n A_1,A_2,\cdots,A_n A1,A2,⋯,An},求函数 f ( i , j ) = m a x { 0 , ∑ k = i j A k } f(i,j)=max\left\{ 0,\sum_{k=i}^{j}A_k \right\} f(i,j)=max{ 0,∑k=ijAk} 的最大值。
算法一:暴力破解法
算出所有的子列和,找出最大的,即为所求。
代码如下:
int maxSubseqSum1(int a[]) {
int preSum = -1, maxSum = -1; //presentSum记录当前Sum,MaxSum记录最大子列和。
int left = -1, right = -1; //left、right记录最大子列的左右端点值。
for (int i = 0; i < n; i++) {
//i记录左端点
for (int j = i; j < n; j++) {
//j记录右端点
preSum = 0;
for (int k = i; k <= j; k++) {
preSum += a[k]; //累加计算a[i]->a[j]的子列和
}
if (preSum > maxSum) {
maxSum = preSum; //更新最大值及其对应的左右边界
left = i;
right = j;
}
}
}
printf("in maxSubseqSum1() left=%d,right=%d,maxSum=%d\t暴力破解法\n", left, right, maxSum);
return maxSum;
}
时间复杂度较容易由3层嵌套for循环得出为
T ( n ) = ∑ i = 1 n ∑ j = i n ∑ k = i j 1 = O ( n 3 ) T(n)=\sum_{i=1}^n\sum_{j=i}^n\sum_{k=i}^j1=O(n^3) T(n)=i=1∑nj