java最大字段和

import java.util.Arrays;

public class 最大字段和 {
	public static void main(String[] args) {
		int a[]= {-2,11,-20,-13,-5,12};
		System.out.println(Arrays.toString(a));
		System.out.println();
		System.out.println("分治方法"+check1(a,0,a.length-1));
		System.out.println("动态规划"+check2(a,a.length));
	}

	private static int check1(int[] a, int left, int right) {   //分治    
		int sum=0;
		if(left==right) {
			sum=a[left]>0? a[left]:0;
		}
		else {
			int center=(left+right)/2;
			int leftsum=check1(a, left, center);
			int rightsum=check1(a, center+1, right);
			int s1=0,lefts=0;
			for(int i=center;i>=left;i--) {
				lefts+=a[i];
				if(lefts>s1) s1=lefts;
				System.out.println("i="+i+"   aa  "+s1); //方便了解过程加的
			}
			int s2=0,rights=0;
			for(int j=center+1;j<=right;j++) {
				rights+=a[j];
				if(rights>s2) s2=rights;
				System.out.println("j="+j+"   bb   "+s2); //方便了解过程加的
			}
			sum=s1+s2;
			if(sum<leftsum) sum=leftsum;
			if(sum<rightsum) sum=rightsum;
			System.out.println(sum+"   leftsum="+leftsum +"   rightsum= "+rightsum+" "); //方便了解过程加的
		}
		return sum;
		
	}
	
	
	
	private static int check2(int[] a, int n) { //动态规划  
	  int sum=0;
	  int b=0;
	  for(int i=0;i<n;i++){        //这个好理解,开始b为0,sum也为0,从数组第一个数开始,第一遍a[0]放在b,
		                           //如果a[0]是正数,那么b就大于sum(0),就将b放进sum;然后开始第二遍,b>0的话就加上第二个数,然后判断加上第二个数是否大于前面的sum
	   
		  
	  if(b>0) b+=a[i]; 
	  else b=a[i];
	  if(b>sum) sum=b;
	  }
	  return sum;
	
	
	
    }

}

刚学习,记录下。

你可能感兴趣的:(java最大字段和)