直接贴代码,文字描述留待以后添加。
package com.au.algorithm;
/**
* 最大子序列,动态规划思想。
*
* @author fuyouming
*
*/
public class MaxSubSequence {
/**
* @param args
*/
public static void main(String[] args) {
// int intArr[] = new int[] { -2, 3, -1, 5, -10, 6, -15, 4 };
int intArr[] = new int[] { -2, -3, -1, -5, -10, -6, -15, -4 };
int curSum = intArr[0]; // 初始化当前序列和为0
int maxSum = intArr[0]; // 初始化最大子序列和为序列第一个元素值
int curStartIdx = 0;// 当前序列的开始位置
int maxStartIdx = 0;// 最大序列的开始位置
int maxEndIdx = 0;// 最大序列的结束位置
/* 开始循环求子序列和 */
for (int i = 1; i < intArr.length; i++) {
curSum = curSum + intArr[i];
// 动态规划部分,舍弃当前序列和为小于当前元素的子序列
if (curSum < intArr[i]) {
curStartIdx = i;// 记录当前序列的开始位置
curSum = intArr[i];// 设置当前序列和为当前元素
}
// 与最大子序列和比较,更新最大子序列和
if (curSum > maxSum) {
maxSum = curSum;
maxStartIdx = curStartIdx;// 记录最大序列的开始位置
maxEndIdx = i;// 记录最大序列的结束位置
}
}
System.out.println("最大子序列从" + maxStartIdx + "到" + maxEndIdx + " 和为"
+ maxSum);
}
}