/**
* 最大连续子序列之和问题求解
*
* 描述:
* 给定k个整数的序列{N1,N2,...,Nk },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= k。
* 最大连续子序列是所有连续子序中元素和最大的一个
*
* 举例:
* 例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{11,-4,13},最大连续子序列和即为20。
*
* @author k8ge
*
*/
public class Solution_MaxSubSeq {
public static void main(String[] args) {
int a[] = {
-2, 11, -4, 13, -5, -2
};
System.out.println(new Solution_MaxSubSeq().maxSubSeq1(a));
System.out.println(new Solution_MaxSubSeq().maxSubSeq2(a));
System.out.println(new Solution_MaxSubSeq().maxSubSeq3(a));
}
/**
* 穷举计算
* 时间:O(n^3)
* 空间:O(1)
*/
public int maxSubSeq1(int[] array) {
int max = Integer.MIN_VALUE;
int length = array.length;
for (int i = 0; i < length; i++) {
for (int j = i; j < length; j++) {
int sum = 0;
for (int k = i; k <= j; k++) {
sum += array[k];
}
max = Math.max(sum, max);
}
}
return max;
}
/**
* 条件:具有最优子结构:即下一个阶段的求解是建立在上一个阶段的解的基础之上
* 定义:f[j] 表示以array[j]结尾的子序列最大和
* 那么:f[j] 要么是以array[j]结尾,要么是从array[j]重新开始
* 公式:f[j] = Max(f[j-1] + array[j], arra[j])
* 时间:O(n)
* 空间:O(n)
*/
public int maxSubSeq2(int[] array) {
int[] f = new int[array.length];
f[0] = array[0];
for (int i = 1; i < array.length; i++) {
f[i] = Math.max(f[i-1] + array[i], array[i]);
}
int max = f[0];
for (int i : f) {
max = Math.max(max, i);
}
return max;
}
/**
* 动态规划再优化
* f[]数组的计算,只依赖前一个解,空间可以省掉
* 时间:O(n)
* 空间:O(1)
*/
public int maxSubSeq3(int[] array) {
int max = array[0];
int tmp = array[0];
for (int i = 1; i < array.length; i++) {
tmp = Math.max(tmp + array[i], array[i]);
max = Math.max(tmp, max);
}
return max;
}
}
转载于:https://my.oschina.net/serverx/blog/851725