最大子序列和问题

来源:互联网 发布:贵阳广电网络营业厅 编辑:程序博客网 时间:2024/06/06 05:08

给定一整数序列A1, A2,… An (可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大
例如:整数序列-2, 11, -4, 13, -5, 2, -5, -3, 12, -9的最大子序列的和为21。对于这个问题,最简单也是最容易想到的那就是穷举所有子序列的方法。利用三重循环,依次求出所有子序列的和然后取最大的那个。当然算法复杂度会达到O(n^3)。

package other;import util.ArrayUtil;public class BiggestSubSequenceSum {    public static void main(String[] args) {        int[] a = new int[]{1,2,-1,2,-5,2,1,1};        ArrayUtil.display(a);        System.out.println(fun1(a));        System.out.println(fun2(a));        System.out.println(fun4(a));    }    //蛮力法   O(N*N*N)    public static int fun1(int[] a){        int re = 0;        for (int i = 0; i < a.length; i++) {            for (int j = i; j < a.length; j++) {                int sum = 0;                for (int k = i; k <= j; k++) {                    sum+=a[k];                }                if(re<sum){                    re = sum;                }            }        }        return re;    }    //O(N*N)    public static int fun2(int[] a){        int re = 0;        for (int i = 0; i < a.length; i++) {            int sum = 0;            for (int j = i; j < a.length; j++) {                sum+=a[j];                 if(re<sum){                    re = sum;                }            }        }        return re;    }    //分治法 【省略】O(logN)    public static int fun3(int[] a){        return 0;    }    //动态规划法【最优解】O(N)    public static int fun4(int[] a){        int Sum = 0;        int thisSum = 0;        for(int i = 0;i<a.length;i++){            thisSum+=a[i];            if(thisSum>Sum){                Sum = thisSum;            }else if(thisSum<0){                thisSum = 0;            }        }        return Sum;    }}
0 0