• [算法]数组中求出下标不连续的任意个数,使得和最大


    给定一个数组,可以从数组中取出下标不连续的任意个数,求可以取出的数的和的最大值,例如:给出数组A[]={1,2,2,5,3,4,3}可以取出的最大和为2+5+4=11。现再给定数组{3,9,7,5,1,3,1,2,7},能取出的数的和的最大值是24。

    方法一:动态规划

    假设原数组为arr,辅助数组为data. 则data[0] = arr[0], data[i] = max{arr[0], arr[1]}.

     i>=2时, data[i] = Max{data[i-1], data[i-2]+arr[i]}

    data[i]表示以子数组arr[0..i]符合条件的最大值。

    public static int getMaxValue(int[] arr){
            int[] data = new int[arr.length];
            data[0] = arr[0];
            data[1] = Math.max(arr[0], arr[1]);
            for (int i = 2; i < arr.length; i++) {
                int val = arr[i];
                data[i] = Math.max(data[i - 1], data[i - 2] + val);
            }
            return data[data.length - 1];
        }

    方法二:非动态规划

    public static int getMaxValue2(int[] arr) {
            int sum1 = 0, sum2 = 0;
            for(int i = 0; i < arr.length; i++){
                if(i % 2==0){
                    sum1 = Math.max(sum2, sum1 + arr[i]);
                }else{
                    sum2 = Math.max(sum1, sum2 + arr[i]);
                }
            }
            return Math.max(sum1,sum2);
        }
  • 相关阅读:
    【LeetCode】085. Maximal Rectangle
    哈希查找
    堆排序
    归并排序
    希尔排序
    快速排序
    堆区和栈区,malloc和new的区别
    C++基础
    二分查找
    冒泡排序
  • 原文地址:https://www.cnblogs.com/DarrenChan/p/9657649.html
Copyright © 2020-2023  润新知