PAT C

Maximum Subsequence Sum

C语言实现

Posted by Jack on September 2, 2010

一、问题描述

给定N个整数的序列{A1,A2······An},求f(i,j) = max(连续子序列和)。

二、代码实现

算法一: 循环遍历

这是最为常见的一种求解方式,采用循环遍历的方式求出最大连续子列和,T(n) = O(n^2)

int maxSubSeqSum(int A[], int N){
    int thisSum = 0;
    int maxSum = 0;
    for (int i = 0; i < N; i++) {
        for (int j = i; j < N; j++) {
            thisSum += A[j];
            if (thisSum > maxSum) {
                maxSum = thisSum;
            }
        }
        thisSum = 0;
    }

    return maxSum;
}
算法二:分而治之

采用分治的思想,通过递归进行求解,T(n) = O(n*Logn)

int maxSubSeqSum(int A[], int leftIndex, int rightIndex){
    if (leftIndex == rightIndex) {
        return A[0];
    }
    int center = (leftIndex + rightIndex) / 2;
    int maxLeftSum = maxSubSeqSum(A, leftIndex, center);
    int maxRightSum = maxSubSeqSum(A, center + 1, rightIndex);
    
    
    int leftBorderSum = 0;
    int leftBorderMaxSum = 0;
    for (int i = center; i >= leftIndex; i--) {
        leftBorderSum += A[i];
        if (leftBorderSum > leftBorderMaxSum) {
            leftBorderMaxSum = leftBorderSum;
        }
    }
    int rightBorderSum = 0;
    int rightBorderMaxSum = 0;
    for (int i = center + 1; i <= rightIndex; i ++) {
        rightBorderSum += A[i];
        if (rightBorderSum > rightBorderMaxSum) {
            rightBorderMaxSum = rightBorderSum;
        }
    }
    int maxBorderSum = leftBorderMaxSum + rightBorderMaxSum;
    
    int maxSum = maxLeftSum > maxRightSum ? maxLeftSum : maxRightSum;
    maxSum = maxSum > maxBorderSum ? maxSum : maxBorderSum;
    
    return maxSum;
}
算法三:在线处理

这是效率最高的问题求解方式,T(n) = O(n)

在线处理是指每输入一个数据就进行即时处理,在任意位置终止输入,算法都能正确给出当前的解

int maxSubSeqSum(int A[], int N){
    int thisSum = 0;
    int maxSum = 0;
    for (int i = 0; i < N; i++) {
        thisSum += A[i];
        if (thisSum > maxSum) {
            maxSum = thisSum;
        }else if(thisSum < 0){
            thisSum = 0;
        }
    }
    
    return maxSum;
}

综上,三种方法时间复杂度从高到低,在线处理的方式为最优算法。