class Solution {
public:
double largestSumOfAverages(vector<int>& A, int K) {
int n = A.size();
// dp[k][i]: largestSumOfAverages of [0,i] with up to k partitions
// dp[0][i]: largestSumOfAverages of [0,i] with 0 partition = (sums[i+1]-sums[0])/(i+1)
// dp[k][i]: max(dp[k-1][j] + (sums[i+1]-sums[j+1]) / (i-j), dp[k-1][i])
vector<vector<double>> dp(K, vector<double>(n, 0));
vector<double> sums(n+1, 0);
for (int i = 0; i < A.size(); i++)
sums[i+1] = sums[i] + A[i];
for (int i = 0; i < n; i++)
dp[0][i] = (sums[i+1] - sums[0]) / (i+1); // single partition
for (int k = 1; k < K; k++) {
for (int i = 0; i < n; i++) {
dp[k][i] = dp[k-1][i];
for (int j = 0; j < i; j++) {
dp[k][i] = max(dp[k][i], dp[k-1][j] + (sums[i+1]-sums[j+1]) / (i-j));
}
}
}
return dp[K-1][n-1];
}
};