首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

最细高挑儿序列和(由浅入深)

2013-09-10 
最长子序列和(由浅入深)O(N^2) package heng.java.level1import java.util.Scannerpublic class TheMost

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

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


 

热点排行