【问题标题】:What is the best answer for finding the maximum sum possible in an array [closed]在数组中找到可能的最大总和的最佳答案是什么[关闭]
【发布时间】:2012-04-21 16:48:31
【问题描述】:

问题是:

在正整数数组中找出可能的最大总和,方法是选择元素,确保没有两个元素彼此相邻。

有这样的答案: 但是这个问题的最佳答案是什么

让我们用“t”表示数组,并从 0 开始索引它。设 f 为 函数使得 f(k)=[0..k] 子数组中具有问题条件的最大和。 现在使用动态规划:

f(0) = t[0]
f(1) = max{ t[0], t[1] }
f(k) = max{ f(k-2) + t[k], f(k-1) } if k >= 2

If the array has n elements we need f(n-1).

提前致谢。

【问题讨论】:

    标签: c arrays algorithm


    【解决方案1】:

    您提出的解决方案是good one

    类似的方法(第 7 页here):

    m[i] 是任何以元素a[i] 结尾的子数组的最大和。然后 m[i] 就是 max(a[i], m[i-1]+a[i])

    这是O(n).

    你不能得到低于O(n)的任何东西,因为你必须访问数组的每个项目至少一次来计算结果。

    【讨论】:

      【解决方案2】:

      嗯,我认为这已经是最好的答案了。
      因为您需要 O(n) 才能读取数据。
      O(n) 算法在大 O 表示法中是最快的。

      【讨论】:

      • 上面的算法不是O(n)。今晚我的算法-分析fu不强,但是上面的算法至少是O(n lg n)或者O(n^2)。
      • 我不懂你。如果您将 f(i) 存储在数组 f[] 中,那么您只需要运行一次计算 f[1]..f[n]。
      • 啊,你是对的。没关系。
      【解决方案3】:
      public static int maxSum(int[] A){
          return maxSum(A,0,1);
      }
      private static int maxSum(int[] A, int x, int y){
          int c =0, d=0;
          if(x<A.length){
              c = A[x]+maxSum(A,x+2,x+3);
          }
          if(y<A.length){
              d = A[y]+maxSum(A,y+2,y+3);
          }
          return c>d?c:d;
      }
      

      【讨论】:

        猜你喜欢
        • 2016-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-09
        • 1970-01-01
        • 1970-01-01
        • 2013-08-19
        • 1970-01-01
        相关资源
        最近更新 更多