对于一个数组中的数进行分组,取每个组里的平均值进行加和的。
使用动态规划,其中dp[i][k]表示以i为结尾的有k个分组的,那么递推式为: dp[i][k]=dp[j][k-1]+(sum[i]-sum[j])/(i-j)的,那么当k=1的时候就初始化为组内的平均值的,其中j的初始化为k-2,因为是从0为起始点的。
class Solution { public: double largestSumOfAverages(vector<int>& A, int K) { int n=A.size(); vector<double> sum(n,0); sum[0]=A[0]; for(int i=1;i<n;i++){ sum[i]=sum[i-1]+A[i]; } vector<vector<double>> dp(n,vector<double>(K+1,0)); for(int k=1;k<=K;k++){ for(int i=0;i<n;i++){ if(k==1){ dp[i][k]=sum[i]/(i+1); } else if(k-2<i){ for(int j=k-2;j<i;j++){ dp[i][k]=max(dp[i][k],dp[j][k-1]+(sum[i]-sum[j])/(i-j) ); } } } } /* for(int i=0;i<n;i++){ for(int j=1;j<=K;j++){ cout<<i<<" "<<j<<" "<<dp[i][j]<<endl; } } */ return dp[n-1][K]; } };