/*【问题描述】给定一整数序列A1, A2,... An (可能有负数),
* 求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大。例如:
* 整数序列 -2, 11, -4, 13, -5, 2, -5, -3, 12, -9的最大子序列的和为21(从A2到A9)
* ;整数序列4,-3,5,-2,1,2,6,-2的最大子序列的和为11(从A1到A7)*/
package maxSubSequence;
* 求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大。例如:
* 整数序列 -2, 11, -4, 13, -5, 2, -5, -3, 12, -9的最大子序列的和为21(从A2到A9)
* ;整数序列4,-3,5,-2,1,2,6,-2的最大子序列的和为11(从A1到A7)*/
package maxSubSequence;
public class maxSubSequenceSolutions {
public static int maxSubSequenceSolution1(int[] sequence) {
int sum = 0;
int max = 0;
for (int i = 1; i <= sequence.length; i++) {
for (int j = 0; j < sequence.length; j++) {
sum = 0;
for (int k = j; k < j + i && k < sequence.length; k++) {
sum += sequence[k];
if (sum > max) {
max = sum;
}
}
}
}
return max;
}// solution1 ends (get all sum of the subsequence) O(n^3)
int sum = 0;
int max = 0;
for (int i = 1; i <= sequence.length; i++) {
for (int j = 0; j < sequence.length; j++) {
sum = 0;
for (int k = j; k < j + i && k < sequence.length; k++) {
sum += sequence[k];
if (sum > max) {
max = sum;
}
}
}
}
return max;
}// solution1 ends (get all sum of the subsequence) O(n^3)
public static int maxSubSequenceSolution2(int[] sequence) {
int sum = 0;
int max = 0;
for (int i = 0; i < sequence.length; i++) {
for (int j = i; j < sequence.length; j++) {
sum += sequence[j];
if (sum > max) {
max = sum;
}
}
}
return max;
}// solution2 ends (利用递推公式减少一重循环){sum(i,j+1)=sum(i,j)+sequence[j+1]} O(n^2)
public static int maxSub3(int[] sequence, int left, int right) {
if (left == right) {
if (sequence[left] > 0) {
return sequence[left];
} else {
return 0;
}
}
int mid = (left + right) / 2;
int maxLeftSum = maxSub3(sequence, left, mid);
int maxRightSum = maxSub3(sequence, right, mid);
int maxLeftBorderSum = 0, leftBorderSum = 0;
for (int i = mid; i >= left; i--) {
leftBorderSum += sequence[i];
if (leftBorderSum > maxLeftBorderSum) {
maxLeftBorderSum = leftBorderSum;
}
}
int maxRightBorderSum = 0, rightBorderSum = 0;
for (int i = mid; i <= right; i++) {
rightBorderSum += sequence[i];
if (rightBorderSum > maxRightBorderSum) {
maxRightBorderSum = rightBorderSum;
}
}
return max(maxRightBorderSum + maxLeftBorderSum, maxLeftSum, maxRightSum);
}
public static int max(int a, int b, int c) {
int max = a > b ? a : b;
max = max > c ? max : c;
return max;
}
int max = a > b ? a : b;
max = max > c ? max : c;
return max;
}
public static int maxSubSequenceSolution3(int[] sequence) {
return maxSub3(sequence, 0, sequence.length - 1);
}//Solution3 ends (递归) O(n*log(n))
return maxSub3(sequence, 0, sequence.length - 1);
}//Solution3 ends (递归) O(n*log(n))
public static int maxSubSequenceSolution4(int[] sequence) {
int max = 0;
int sum =0;
for (int i=0;i<sequence.length;i++) {
sum+=sequence[i];
if (sum>max)
max =sum;
if(sum<0)
sum =0;
}
return max;
}//Solution4 ends (动态规划) O (n)
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}