最大平均值

时间:2019-04-02 21:42:01

标签: java algorithm dynamic-programming

Problem Statement

  

我们将数字A的行划分为最多K个相邻的(非空)   组,那么我们的分数就是每个组的平均值之和。什么   能达到的最高分数是什么?

     

请注意,我们的分区必须使用A中的每个数字,并且得分   不一定是整数。

我专门试图了解集合生成背后的方法。考虑下面的示例数组。

  

N = 5,元素:[9,1,2,3,9,8]

     

k = 3

问题要求生成最大为k的步长。例如,我们可以具有以下生成的集合(尽管实际集合会更大)。

  
      
  • [9,1,2]和[3,9,8]
  •   
  • [9],[1,2,3],[9、8]
  •   
  • [9,1,2],[3],[9、8]
  •   

我试图理解没有记忆的幼稚递归解决方案。

问题:

  

我添加了日志以了解如何生成这些集合。我无法   理解如何使用来生成集合[9,1,2] [3,9,8]   以下代码段。更重要的是,它如何涵盖所有内容   可能的设置最大为3。

  public double largestSumOfAverages(int[] arr, int groupSize) {
    int[] sum = new int[arr.length];

    for (int i = 0; i < arr.length; i++) {
      sum[i] = arr[i] + (i > 0 ? sum[i - 1] : 0);
    }

    System.out.println(Arrays.toString(sum));
    return dfs(arr, groupSize, sum, arr.length, 0);
  }

  public double dfs(int[] arr, int groupSize, int[] sumToIthIndex, int right, int left) {
    if (groupSize == 1) {
      double avg1 = ((double) (sumToIthIndex[right - 1] - sumToIthIndex[left] + arr[left]) / (right
          - left));

      System.out.println(" dfs return :: " + left + " right:: " + right + "  :grpSize:: " + groupSize);
      return avg1;
    }
    double num = 0;
    for (int index = left; index + groupSize <= right; index++) {
      System.out.println(" dfs left:: " + index + " right:: " + right + "  :grpSize:: " + groupSize);
      num = Math.max(num,
          ((double) (sumToIthIndex[index] - sumToIthIndex[left] + arr[left]) / (index - left
              + 1)) + dfs(arr, groupSize - 1, sumToIthIndex, right,index + 1));
    }
    System.out.println("End");
    return num;
  }

2 个答案:

答案 0 :(得分:1)

您实际上并不需要涵盖所有大小最大为3的设置,因为您将ALWAYS要使用给您可用的最大组数(假设所有值都是正数)。

假设组的大小为k,并且找到了k-1个组的最佳答案。如果您选择这些组中的一个,则从中获得最高的价值并将其放入自己的组中,那么您将获得更高或相等的分数,因此您的答案并不是真正的最佳选择。 (n个数字的平均值永远不会高于这些数字中的最大数字)

答案 1 :(得分:0)

我不了解该算法,但是我想做的就是尝试用我的头做示例,以了解代码的工作原理。 在这里,我进行了循环的第一次迭代:

FIRST ITERATION
1) groupeSize = 3, right = 6, left = 0, index = 0, 
    num = max(0, ((9 - 9 + 9) / 1) + <5.5>)) = 14.5
2) groupeSize = 2, right = 6, left = 1, index = 0,
    num1 = max(0, ((9 - 10 + 1 / (0 - 1 + 1)) + <5.5>)) = 5.5
3) groupeSize = 1, right = 6, left = 2, index = 0, avg1 = ((32 - 12 + 2) / (6-2)) = 5.5

对应于[9,1,2], [3], [9, 8]的平均值之和

每个1),2),...是一个递归,<>之间的所有值都是相反的顺序(从递归返回时)

尝试继续理解!祝你好运!