LeetCode 813. 最大平均值和的分组

813. 最大平均值和的分组

我们将给定的数组 A 分成 K 个相邻的非空子数组 ,我们的分数由每个子数组内的平均值的总和构成。计算我们所能得到的最大分数是多少。

注意我们必须使用 A 数组中的每一个数进行分组,并且分数不一定需要是整数。

示例:
输入: 
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].
这样的分组得到的分数为 5 + 2 + 6 = 13, 但不是最大值.

题解:基本的线性动态规划了,O(N3)复杂度,这里并不能记录优化内层循环,后面写个线性动规的总结.

dp[i][j]记录前i个数分j段的最优解.

class Solution {
public:
    double largestSumOfAverages(vector<int>& A, int K) {
        int sz = A.size();
  		std::vector<int> sum(sz+1,0);
  		for(int i = 1;i<=sz;++i)
  		{
  			sum[i] = sum[i-1] + A[i-1];
  		}

  		vector< vector<double> > dp(sz+1,vector<double>(sz+1,0));
  		
  		for(int i = 1;i<=sz;++i)
  		{
  			dp[i][1] = 1.0*sum[i]/i;
  			for(int k = 2;k <= K && k <= i;++k)
  			{
  				for(int j = 1;j<i;++j)
  					dp[i][k] = max(dp[i][k],dp[j][k-1]+1.0*(sum[i]-sum[j])/(i-j));
  			}
  		}      
  		return dp[sz][K];
    }
};
发布了257 篇原创文章 · 获赞 36 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/sgh666666/article/details/98874443