假设我们将数字A的行划分为最多K个相邻的组,然后将score设置为每组平均值的总和。我们必须找到可以达到的最大分数。假设A = [9,1,2,3,9]并且K为3,那么结果将为20,这是因为,最佳选择是将A划分为[9],[1、2、3], [9]。因此答案是9 +(1 + 2 + 3)/ 3 + 9 =20。我们也可以将A划分为[9,1],[2],[3,9],
为了解决这个问题,我们将遵循以下步骤-
定义矩阵dp
定义一个递归方法solve(),它将采用数组A,索引和k
如果索引> = A的大小,则返回0
如果k为0,则返回-100000
如果dp [index,k]不是– 1,则返回dp [index,k]
ret:= -inf和sum:= 0
因为我的范围指数是A – 1
总和:=总和+ A [i]
ret:= ret和sum /((i – index +1)+ solve(A,i + 1,k – 1)的最大值
设置dp [index,k]:=退出并返回。
从主要方法中,执行以下操作-
n:= A的大小
dp:=矩阵nx(K + 1),用– 1填充
返回solve(A,0,K)
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class Solution { public: vector < vector <double> > dp; double solve(vector <int>& A, int idx, int k){ if(idx >= A.size()) return 0; if(!k) return -100000; if(dp[idx][k] != -1) return dp[idx][k]; double ret = INT_MIN; double sum = 0; for(int i = idx; i < A.size(); i++){ sum += A[i]; ret = max(sum / (i - idx + 1) + solve(A, i + 1, k - 1), ret); } return dp[idx][k] = ret; } double largestSumOfAverages(vector<int>& A, int K) { int n = A.size(); dp = vector < vector <double> > (n, vector <double>(K + 1, -1)); return solve(A, 0, K); } }; main(){ vector<int> v = {9,1,2,3,9}; Solution ob; cout << (ob.largestSumOfAverages(v, 3)); }
[9,1,2,3,9] 3
输出结果
20