LeetCode 813. 最大平均值和的分组 (二维DP、背包问题变种)

最大平均值和的分组

  • 题意:
    我们将给定的数组 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][k1]+sum[j+1,i]/(ij)}(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];
    }
};

猜你喜欢

转载自blog.csdn.net/qq_44846324/article/details/108454380