我们将给定的数组 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];
}
};