dp_1: 最大连续子序列之和
给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序中元素和最大的一个, 例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和为20。
下面是程序:
/** * Created by feng_sh on 4/10/2017. * 给定K个整数的序列{ N1, N2, ..., NK }, * 其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。 * 最大连续子序列是所有连续子序中元素和最大的一个, * 例如给定序列{ -2, 11, -4, 13, -5, -2 }, * 其最大连续子序列为{ 11, -4, 13 },最大和为20。 * * 递推关系式为: p[i] = max{p[i-1]+v[i], v[i]} * 空间复杂度O(n) 时间复杂度O(n) * i为第i个数, p为当前值, 第i个加入队列时的值 和 从当前开始最大的值 */ public class T1 { public static void main(String[] args) { Random random = new Random(47); int len = 20; // int[] source = new int[len]; int[] value = new int[len]; int maxValue = 0; source[0] = random.nextInt(len / 2); value[0] = source[0]; for (int i = 1; i < len; i++) { // 生成数据 source[i] = (int) (random.nextInt(len / 2) * Math.pow(-1, random.nextInt())); // 利用递推方程进行计算 value[i] = Math.max(value[i - 1] + source[i], source[i]); if (value[i] > maxValue) { maxValue = value[i]; } } // 源数组 System.out.println(Arrays.toString(source)); // 状态数组 System.out.println(Arrays.toString(value)); // 最大和 System.out.println(maxValue); // 另一种空间优化方案的和 optimize(source); } /** * 这里求出最大和, * 这一种方案空间复杂度O(1) */ private static void optimize(int[] source) { int last = source[0]; int max = last; for (int i = 1; i < source.length; i++) { last = Math.max(last + source[i], source[i]); if (last > max) { max = last; } } System.out.println(max); } }