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);
    }

}

 

posted @ 2017-04-11 15:02  山里的小房子  阅读(269)  评论(0编辑  收藏  举报