Java 平均数的最大和

Java 平均数的最大和,java,algorithm,dynamic-programming,Java,Algorithm,Dynamic Programming,: 我们将一行数字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] 我试图理解没有记忆

:

我们将一行数字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]
我试图理解没有记忆的简单递归解决方案

问题:

我添加了日志以了解这些集合是如何生成的。我不能 了解如何使用 下面是代码片段。更重要的是,它如何涵盖所有 最大尺寸为3的可能设置

公共双最大平均消费(int[]arr,int groupSize){
int[]总和=新的int[arr.length];
对于(int i=0;i0?和[i-1]:0);
}
System.out.println(Arrays.toString(sum));
返回dfs(arr、groupSize、sum、arr.length、0);
}
公共双dfs(int[]arr,int groupSize,int[]sumToIthIndex,int right,int left){
if(groupSize==1){
双精度avg1=((双精度)(sumToIthIndex[右-1]-sumToIthIndex[左]+arr[左])/(右
-左),;
System.out.println(“dfs返回::“+left+”right:“+right+”:grpSize::“+groupSize”);
返回avg1;
}
双数=0;

对于(int index=left;index+groupSize,您实际上不需要覆盖大小为3的所有可能设置,因为您将
始终
希望使用可用的最大组数(假设所有值均为正值)


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

我不理解算法,但我要做的是试着用我的脑袋来做这个例子,以了解代码是如何工作的。 在这里,我进行了循环的第一次迭代:

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
第一次迭代
1) groupeSize=3,right=6,left=0,index=0,
num=max(0,((9-9+9)/1)+=14.5
2) groupeSize=2,right=6,left=1,index=0,
num1=max(0,((9-10+1/(0-1+1))+)=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),…都是一个递归,并且
之间的所有值都是以相反的顺序知道的(从递归返回时)


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

你能用一个例子来解释吗?我很抱歉发布了这个问题,现在在阅读了你的答案后,我意识到,我对这个问题的解释是错误的。我认为我们可以选择尽可能多的组,条件是任何组都有最多“K”个成员。例如[1,2,3,4,5,6,7]&K=3。以下组有效[1]、[2,3,4]、[5,6]、[7],因为所有成员组最多有3个值。尽管此组无效[1,2,3,4][5]、[6]、[7]因为其中一个组有4个成员。我想知道,这样一个问题的解决方案是什么,简单地在数组中找到最大的值,这会起作用吗?好吧,你的解释的解决方案是将每个元素放入自己的组中,因为a+B>(a+B)/2,这是我的直觉,但等式使事情具体化。
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