leetcode 813. Largest Sum of Averages

对于一个数组中的数进行分组,取每个组里的平均值进行加和的。

使用动态规划,其中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];
    }
};

 

posted on 2018-09-11 23:17  昔风不止,唯有努力生存  阅读(129)  评论(0编辑  收藏  举报

导航