这道题题意很简单,不多讲,我的思路就是这样:
题目就是要求我们要将数组分成K部分,那设置一个循环从0到A.size()-K分割(若超过A.size()-K,剩下的部分就不够分成K-1个部分了),想必到这也就很自然的想到了递归调用,对,把A剩下的部分(从i以后)复制给B,此时再求把B分成K-1个部分的最大值即可,求出之后再把前面部分的平均值(就是avg=sum/(i+1))加起来就是最大值了。
但这样提交上去会超时,因为会重复计算,比如说(1,2,3,4,5,6)分成4部分,会有这种情况(1|,2,3|,4,5,6),
(1,2|,3|,4,5,6)两个分支都是要把(4,5,6)分解成两部分,会出现重复求解,所以用一个a[101][101]来保存数据,这个二维数组的行是由A.size()决定,列是由K决定,这样就解决了重复计算问题。
写的不好还请各位大佬指教
class Solution {
public:
double a[101][101]={0};
double largestSumOfAverages(vector<int>& A, int K) {
double maxcount=0,sum=0,avg=0;
vector<int>B;
if(a[A.size()][K]!=0)
maxcount=a[A.size()][K];
else
{
if(K==1)
{
for(int i=0;i<A.size();i++)
{
sum=sum+A[i];
}
maxcount=sum/A.size();
a[A.size()][K]=maxcount;
}
else
{
for(int i=0;i<=A.size()-K;i++)
{
sum=0;
for(int k=0;k<=i;k++)
{
sum=sum+A[k];
}
B.assign(A.begin()+i+1,A.end());
avg=sum/(i+1);
maxcount=max(maxcount,avg+largestSumOfAverages(B,K-1));
a[A.size()][K]=maxcount;
}
}
}
return maxcount;
}
};