zoukankan      html  css  js  c++  java
  • 最长子序列和(由浅入深)

    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;
    	}
    	
    }
    


     

  • 相关阅读:
    linux常用命令
    10.8统计英文词频
    9月10号作业
    华氏温度与摄氏温度转换
    小故事
    Java的工厂模式(三)
    Javascript实现图片翻转
    Java的工厂模式(二)
    Java的工厂模式(一)
    Java新建线程的两种方式
  • 原文地址:https://www.cnblogs.com/riskyer/p/3310642.html
Copyright © 2011-2022 走看看