当前位置: 代码迷 >> 综合 >> LeetCode 813. 最大平均值和的分组
  详细解决方案

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

热度:91   发布时间:2024-01-22 01:33:06.0

 

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];}
};