-
题意:
我们将给定的数组 A 分成 K 个相邻的非空子数组 ,我们的分数由每个子数组内的平均值的总和构成。计算我们所能得到的最大分数是多少。
注意我们必须使用 A 数组中的每一个数进行分组,并且分数不一定需要是整数。 -
状态: d p [ i ] [ k ] dp[i][k] dp[i][k]表示前缀串分成k段所获得的最大值。
-
DP方程: d p [ i ] [ k ] = m a x { d p [ j ] [ k − 1 ] + s u m [ j + 1 , i ] / ( i − j ) } ( j < i ) dp[i][k]=max\{dp[j][k-1]+sum[j+1,i]/(i-j)\}(j<i) dp[i][k]=max{ dp[j][k−1]+sum[j+1,i]/(i−j)}(j<i)
再用滚动数组优化一下,注意边界。
class Solution {
public:
double largestSumOfAverages(vector<int>& a, int K) {
double dp[110] = {
0};
int n = a.size(),s[110] = {
0};
s[0] = a[0];
for(int i=1;i<n;i++) s[i] = s[i-1]+a[i];
for(int i=0;i<n;i++) dp[i] = 1.0*s[i]/(i+1);
for(int k=2;k<=K;k++){
for(int i=n-1;i>=k-1;i--){
for(int j=k-2;j<i;j++){
dp[i] = max(dp[i],dp[j]+1.0*(s[i]-s[j])/(i-j));
}
}
}
return dp[n-1];
}
};