【问题标题】:Maximum array sum最大数组总和
【发布时间】:2016-01-23 13:53:06
【问题描述】:

我得到一个整数数组。我需要找到其元素的最大总和,以便任何两个元素都不是邻居。示例: sum(2, 5, 2) = 5 因为我们只选择 5; sum(3, 10, 2, 4, 10) = 20 因为我们选择了 10 和 10; sum(10, 12, 5, 2) = 15 因为我们选择 10 和 5。 如何使用任何编程语言来完成? 我已经在这个问题上工作了几个小时,我唯一知道它应该使用 DP。

【问题讨论】:

  • 改正很容易..有什么问题?
  • 这些讲座对于家庭作业问题的想象力越来越丰富 - 那么您尝试了什么?
  • 我真的很想看到这个问题的答案......我拿了一支铅笔和一张纸,解决了这个问题几个小时没有结果......所以任何人都可以发布这个答案问题而不是评论无用的东西!

标签: arrays dynamic-programming


【解决方案1】:

所以我在不使用 DP 的情况下用 Java 实现了一个解决方案;我只是使用了递归。我会试着解释一下。

首先,我们要找到一个基本情况:

  • 如果数组长度 == 1,则 sum(array) = array[0]
  • 另外,如果数组长度 == 2,那么 sum(array) = max(array[0],array[1])

现在,让我们来看看array.length = n 的一般情况。我们必须决定 array[n-1] 是否是解决方案的一部分;也就是说,如果对前 n-1 个元素启动的 sum 小于对前 n-2 个元素 + 第 n 个元素启动的 sum。

简而言之,我们的意思是“考虑第 n 个元素还是它的邻居 (nth-1) 更好?”事实上,我们不能同时考虑两者,因此我们必须选择一个。

private static int sum (int[] array) {
    return aux (array,array.length);
}
private static int aux (int[] array, int upTo) {

    if (upTo == 1)
        return array[0];
    else if (upTo == 2)
        return (array[1] > array[0]) 
                ? array[1] : array[0];
    else {
        int tmpMax1 = aux (array,upTo-1);
        int tmpMax2 = aux (array,upTo-2) + array[upTo-1];

        return (tmpMax2 > tmpMax1)
                ? tmpMax2 : tmpMax1;
    }
}

public static void main(String[] args) {
    //just a bunch of simple tests. Too lazy to use JUnit
    System.out.println(sum(new int[]{2}) + " = 2");
    System.out.println(sum(new int[]{2, 5}) + " = 5");
    System.out.println(sum(new int[]{2, 5, 2}) + " = 5");
    System.out.println(sum(new int[]{3, 10, 2, 4, 10}) + " = 20");
    System.out.println(sum(new int[]{10, 12, 5, 2}) + " = 15");
    System.out.println(sum(new int[]{10, 12, 5, 2,100}) + " = 115");
    System.out.println(sum(new int[]{10, 10, 10, 10,100}) + " = 120");

}

【讨论】:

  • 非常感谢!解释和解决方案很完美
猜你喜欢
  • 2020-10-23
  • 1970-01-01
  • 2013-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-08
  • 2019-12-25
相关资源
最近更新 更多