连续子元素最大和

n^2解法

        /**
         * 1. 如果有连续的正数,那么只要考虑第一个。因为假设某个子串的和是最大的,但这个子串首位前一个是个正数,
         * 那么这个子串加上这个正数形成的子串和会更大,产生了矛盾,因此假设不成立。
         * 2. 所以最大和的子串前一位必为负数(0、或没有数)
         */
        int arr[] = {8, -2, 5, 1, -4, 7, 6, -9, 1, 13};
        int max = Integer.MIN_VALUE;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] > 0 && i > 0 && arr[i - 1] < 0 || arr[i] > 0) {
                int sum = 0;
                for (int j = i; j < arr.length; j++) {
                    sum += arr[j];
                    if (sum > max) {
                        max = sum;
                    }
                }
            }
        }
        System.out.println(max);

n解法(动态规划)

状态转移方程为:
MaxSum[i] = Max{ MaxSum[i-1] + A[i], A[i]}
MaxSum[i]表示下标为i及以前的序列中的连续子元素最大和
A[i]表示下标为i的元素值

int MaxSubSequence(int A[], int N) {
        int ThisSum, MaxSum, j;
        ThisSum = MaxSum = 0;
        for (j = 0; j < N; j++) {
            ThisSum += A[j];

            if (ThisSum > MaxSum)
                MaxSum = ThisSum;
            else if (ThisSum < 0)   // 相当于前面就是一个负数了,所以舍弃(解法一第二点规则)
                ThisSum = 0;
        }
        return MaxSum;
    }
posted @ 2017-04-17 19:45  zyoung  阅读(248)  评论(0)    收藏  举报