zoukankan      html  css  js  c++  java
  • 2.14 子数组之和的最大值

    问题:

    求数组的子数组之和的最大值


    解法一:

    遍历

    #include <stdio.h>
    #include <stdlib.h>
    
    int MaxSum(int* A, int n)
    {
        int maximum = -100;
        int sum = 0;
        int i = 0, j = 0, k = 0;
        for (i = 0; i < n; i++)
        {
            for(j = i; j < n; j++)
            {
                for(k = i; k <= j; k++)
                {
                    sum += A[k];
                }
                if (sum > maximum)
                    maximum = sum;
            }
        }
        return maximum;
    }
    
    int main()
    {
        int array[] = {-9, -2, -3, -5, -3};
        printf("%d
    ", MaxSum(array, 5));
        return 0;
    }
    



    解法二:

    分治法,考虑A[0]以及最大的一段数组(A[i],...,A[j])之间的关系。

    1. 当0=i=j,元素A[0]本身构成和最大的一段。

    2. 当0=i<j,和最大的一段以A[0]开始。

    3. 当0<i时,元素A[0]跟和最大的一段没有关系。

    #include <stdio.h>
    #include <stdlib.h>
    
    int max(int x, int y)
    {
        return (x > y) ? x :y;
    }
    
    int MaxSum(int* array, int n)
    {
        int nStart = 0;
        int aAll = 0;
        int i = 0;
        nStart = array[n-1];
        aAll = array[n-1];
        for (i = n-2; i >= 0; i--)
        {
            nStart = max(array[i], nStart + array[i]);
            aAll = max(nStart, aAll);
        }
        return aAll;
    }
    
    int main()
    {
        int array[] = {-9, -2, -3, -5, -3};
        printf("%d
    ", MaxSum(array, 5));
        return 0;
    }
    


  • 相关阅读:
    《大道至简》第一章 编程的精义
    java课堂练习7
    Java课后练习6
    Java课后练习5
    Java课后练习4
    Java课后练习3
    课堂练习
    求和程序实验报告
    大道至简第二章读后感
    课堂作业例子
  • 原文地址:https://www.cnblogs.com/pangblog/p/3310553.html
Copyright © 2011-2022 走看看