最大子序列和问题:
一步一步推进:
package com.pack.algo;
public class MAXSUM {
//1.三层循环暴力求解
public static int maxSum1(int [] a,int n) {
int thisSum,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;
}
//2,两层循环
public static int maxSum2(int [] a,int n) {
int thisSum=0,maxSum=0;
for(int i=0;i<n;i++) {
thisSum=0;
for(int j=0;j<n;j++) {
thisSum+=a[j];
if(thisSum>maxSum) maxSum=thisSum;
}
}
return maxSum;
}
//3,分治法
public static int maxSubSum3(int [] a,int n) {
return maxSum(a,0,n-1);
}
public static int maxSum(int [] a,int left,int right) {
int maxLeftSum,maxRightSum;
int maxLeftBorderSum=0,maxRightBorderSum=0;
int leftBorderSum=0,rightBorderSum=0;
if(left==right) {
if(a[left]>0) return a[left];
else return 0;
}
int center=(left+right)/2;
maxLeftSum=maxSum(a,left,center);
maxRightSum=maxSum(a,center+1,right);
for(int i=center;i>=left;i--) {
leftBorderSum+=a[i];
if(leftBorderSum>maxLeftBorderSum) maxLeftBorderSum=leftBorderSum;
}
for(int i=center+1;i<right;i++) {
rightBorderSum+=a[i];
if(rightBorderSum>maxRightBorderSum) maxRightBorderSum=rightBorderSum;
}
return Max(maxLeftSum,maxRightSum,maxLeftBorderSum+maxRightBorderSum);
}
public static int Max(int a, int b, int c) {
if(a>b &&a>c) return a;
else if(b>a&&b>c) return b;
else return c;
}
//------------------------------------------------------------------------------------------------------------------
//4.动态规划
public static int maxSubSequence(int [] a,int n) {
int thisSum=0,maxSum=0;
for(int j=0;j<n;j++) {
thisSum+=a[j];
if(thisSum>maxSum) {
maxSum=thisSum;
}else if(thisSum<0) {
thisSum=0;
}
}
return maxSum;
}
public static void main(String[] args) {
int [] A=new int[] {6,-1,5,4,-7};
int n=5;
System.out.println(maxSubSum3(A,n));
}
}
[点击并拖拽以移动]