最大子序列问题

现在我们将叙述两个算法来求解最大子序列和问题;

方法一 :

#include ;

int MAXSubseQuenceSum(int A[], int N);

int main()
{
    int A[15] = { -10,-15,6,8,-8,
    6,-4,-10,15,-8,
    15,-7,-10,-7,5 };
    printf("Max=%d", MAXSubseQuenceSum(A, 15));
    return 0;
}

int MAXSubseQuenceSum(int A[15], int N)
{
    int ThisSum, MaxSum;
    int B[15];

    MaxSum = 0;
    for (int i = 0; i <= N; i++)
    {
        ThisSum = 0;
        for (int j = i; j <= N; j++)
        {
            ThisSum += A[j];
            if (ThisSum > MaxSum)
            {
                MaxSum = ThisSum;
                for (int p = i; p <= j; p++)
                {
                    B[p] = A[p];
                }
            }
        }
    }
    for (int i = 0; i <= N; i++)
    {
        printf("B[%d]=%d\n", i, B[i]);
    }
    return MaxSum;
}
他只是穷举式的尝试所有可能,for循环中的循环变量反应C中数组从0开始而不是从1开始这一个事实。运行时间为O(N^3),这完全取决于for循环的层数。第二个循环 大小为N-i,他可能要小,但也可能是N。我们必须假设最坏的情况,而这也可能使最终的界有些大。第三个循环的大小为j-i+1,我们也要假设他的大小为N。因此总数为O(1*N*N)=O(N^3)。

方法二:


#include ;

int MAXSubseQuenceSum(int A[], int N);

int main()
{
    int A[15];
    for (int i = 0; i < 15; i++)
    {
        printf("请输入第%d个数=", i + 1);
        scanf_s("%d", &A[i]);
        printf("\n");
    }
    printf("Max=%d", MAXSubseQuenceSum(A, 15));

    return 0;
}

int MAXSubseQuenceSum(int A[15], int N)
{
    int ThisSum, MaxSum;

    MaxSum = 0;
    for (int i = 0; i <= N; i++)
    {
        for (int j = i; j <= N; j++)
        {
            ThisSum = 0;
            for (int k = i; k <= j; k++)
            {
                ThisSum += A[k];
                if (ThisSum > MaxSum)
                    MaxSum = ThisSum;
            }
        }
    }
    return MaxSum;
}

该方法采用一种“分治”的策略。其想法是把一个问题划分成两个大致相等的两个子问题,然后递归的对他们求解,这是“分”部分。“治”阶段是将两个子问题的解合并到一起,并可能在做些少量的附加工作,最后得到整个问题的解。

你可能感兴趣的:(计算机网络)