평균의 【LeetCode 813】 최대 합계

제목 설명

우리는 우리의 점수는 각 그룹의 평균의 합이며, 대부분의 K에서 인접한 (비어) 그룹으로 숫자 A의 행을 분할. 우리가 달성 할 수있는 최대 점수는 무엇입니까?

우리의 파티션이있는 모든 번호를 사용해야합니다, 그 점수는 반드시 정수되지 않습니다.

예:

Input: 
A = [9,1,2,3,9]
K = 3
Output: 20
Explanation: 
The best choice is to partition A into [9], [1, 2, 3], [9]. The answer is 9 + (1 + 2 + 3) / 3 + 9 = 20.
We could have also partitioned A into [9, 1], [2], [3, 9], for example.
That partition would lead to a score of 5 + 2 + 6 = 13, which is worse.

노트 :

1 <= A.length <= 100
1 <= A [I]가 <= 10000
(1) <= K <= A.length.
정답의 10 ^ -6 이내 답변 올바른으로 허용됩니다.

사고

DP [I] [K]를 K 그룹들로 I + 1 번째의 소자, 및 최대 값의 평균값 전에 0에서 나타낸다.
배열을, 제 I 요소, K-1, K, DP [I] [K]를 분할 위치 J를 가로 지르는 최대 (DP가 = [I] [K], DP [J-1] [K-1] + 평균 (j, i)는), 최대 값을 찾는 방법.

이 아이디어는 할 것 같습니다. .
하나는 일이 할 것, 볼 수 있습니다. .
어떤 상황. . .

코드

class Solution {
public:
    double largestSumOfAverages(vector<int>& A, int K) {
        int n = A.size();
        vector<vector<double> > dp(n+1, vector<double>(K+1, 0));
        vector<int> sum(n+1, 0);
        
        sum[0] = A[0];
        for (int i=1; i<n; ++i) {
            sum[i] = sum[i-1] + A[i]; 
        }
        
        for (int i=0; i<n; ++i) {
            dp[i][1] = sum[i] * 1.0 / (i+1);
            for (int k=2; k<=K && k<=i+1; ++k) {
                for (int j=1; j<=i; ++j) {
                    dp[i][k] = max(dp[i][k], dp[j-1][k-1] + (sum[i]-sum[j-1])*1.0 / (i-j+1));
                }
            }
        }
        
        return dp[n-1][K];
    }
};
게시 된 243 개 원래 기사 · 원 찬양 10 ·은 10000 +를 볼

추천

출처blog.csdn.net/iCode_girl/article/details/104497342