连续子序列最大和问题:下面列出了立方求解、平方求解以及线性求解算法。
/**
*
* @author wawlian
* 连续子序列最大和问题
*
*/
public class MaxSubSequence {
//标注子序列起始位置
private static int seqStart = 0;
//标注子序列终止位置
private static int seqEnd = 0;
/**
* 连续子序列最大和问题的立方求解算法
* @param a 整数序列组成的数组
* @return 最大子序列之和的值
*/
public static int maxSubSequenceSum(int[] a) {
int maxSum = 0;
//用i来标记每个序列的起始位置
for(int i = 0; i < a.length; i++) {
//用j来标记每个序列的终止位置
for(int j = 0; j < a.length; j++) {
int thisSum = 0;
for(int k = i; k <= j; k++) {
thisSum += a[k];
if(thisSum > maxSum) {
maxSum = thisSum;
seqStart = i;
seqEnd = j;
}
}
}
}
return maxSum;
}
/**
* 连续子序列最大和问题的平方求解算法
* @param a 整数序列组成的数组
* @return 最大子序列之和的值
*/
public static int maxSubSequenceSum1(int[] a) {
int maxSum = 0;
for(int i = 0; i < a.length; i++) {
int thisSum = 0;
for(int j = i; j < a.length; j++) {
thisSum += a[j];
if(thisSum > maxSum) {
maxSum = thisSum;
seqStart = i;
seqEnd = j;
}
}
}
return maxSum;
}
/**
* 连续子序列最大和问题的线性求解算法
* @param a 整数序列组成的数组
* @return 最大子序列之和的值
*/
public static int macSubSequenceSum2(int[] a) {
int maxSum = 0;
int thisSum = 0;
for(int i = 0, j = 0; j < a.length; j++) {
thisSum += a[j];
if(thisSum > maxSum) {
maxSum = thisSum;
seqStart = i;
seqEnd = j;
}
else if(thisSum < 0) {
i = j + 1;
thisSum = 0;
}
}
return maxSum;
}
}