最长子序列和(由浅入深)

O(N^2)

 

package heng.java.level1;

import java.util.Scanner;

public class TheMostLongSequenceSum4 {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int m = input.nextInt();
		while(m-->0){
			int n = input.nextInt();
			int [] arr = new int [n];
			for (int i = 0; i < n; i++) {
				arr[i] = input.nextInt();
			}
			int max = maxSubSum(arr);
			System.out.println(max);
		}
	}
	public static int maxSubSum(int []arr){
		int maxSum = 0;
		for (int i = 0; i < arr.length; i++) {
			int thisSum = 0;
			for (int j = i; j < arr.length; j++) {
				thisSum += arr[i];
				if(thisSum > maxSum){
					maxSum = thisSum;
				}
			}
		}
		return maxSum;
	}

}

 

 O(1)

 

package heng.java.level1;

import java.util.Scanner;

public class TheMostLongSequenceSum3 {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int m = input.nextInt();
		while(m-->0){
			int n = input.nextInt();
			int [] arr = new int [n];
			for (int i = 0; i < n; i++) {
				arr[i] = input.nextInt();
			}
			int max = maxSubSum(arr);
			System.out.println(max);
		}
		
	}
	public static int maxSubSum(int []arr){
		int maxSum = 0, thisSum = 0;
		for(int j=0; j<arr.length; j++){
			thisSum += arr[j];
			if(thisSum > maxSum){
				maxSum = thisSum;
			}else if(thisSum < 0){
				thisSum = 0;
			}
		}
		return maxSum;
	}
}


 

O(N) 

递归&&分治法:

package heng.java.level1;

import java.util.Scanner;

public class TheMostLongSequenceSum2 {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int m = input.nextInt();
		
		while(m-->0){
			int n = input.nextInt();
			int [] arr = new int [n];
			for (int i = 0; i < n; i++) {
				arr[i] = input.nextInt();
			}
			int max = maxSumRec(arr,0,arr.length-1);
			System.out.println(max);
			
		}
	}
	public static int maxSumRec(int []arr, int left, int right){
		if(left == right){
			if(arr[left] > 0){
				return arr[left];
			}else{
				return 0;
			}
		}
		int center = (left+right)/2;
		int maxLeftSum = maxSumRec(arr,left,center);
		int maxRightSum = maxSumRec(arr,center+1,right);
		
		int maxLeftBorderSum=0,leftBorderSum=0;
		for(int i=center; i>=left; i--){
			leftBorderSum += arr[i];
			if(leftBorderSum > maxLeftBorderSum){
				maxLeftBorderSum = leftBorderSum;
			}
		}
		int maxRightBorderSum=0,rightBorderSum=0;
		for(int i=center+1; i<=right; i++){
			rightBorderSum += arr[i];
			if(rightBorderSum > maxRightBorderSum){
				maxRightBorderSum = rightBorderSum;
			}
		}
		int sum = maxRightBorderSum+maxLeftBorderSum;
		if(sum < maxLeftSum) sum = maxLeftSum;
		if(sum < maxRightSum) sum = maxRightSum;
		return sum;
	}
	
}


 

 

posted on 2013-09-09 19:57  you Richer  阅读(336)  评论(0编辑  收藏  举报