zoukankan      html  css  js  c++  java
  • 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);
        }
    
    }
  • 相关阅读:
    MSSQL大量数据时,建立索引或添加字段后保存更改超时该这么办
    POJ 3261 Milk Patterns (后缀数组)
    POJ 1743 Musical Theme (后缀数组)
    HDU 1496 Equations (HASH)
    694. Distinct Substrings (后缀数组)
    POJ 1222 EXTENDED LIGHTS OUT (枚举 或者 高斯消元)
    POJ 1681· Painter's Problem (位压缩 或 高斯消元)
    POJ 1054 The Troublesome Frog (hash散列)
    HDU 1716 排列2
    HDU 4405 Aeroplane chess (概率DP & 期望)
  • 原文地址:https://www.cnblogs.com/weikongziqu/p/6693579.html
Copyright © 2011-2022 走看看