题目描述
Given an integer array A, you partition the array into (contiguous) subarrays of length at most K. After partitioning, each subarray has their values changed to become the maximum value of that subarray.
Return the largest sum of the given array after partitioning.
Example 1:
Input: A = [1,15,7,9,2,5,10], K = 3
Output: 84
Explanation: A becomes [15,15,15,9,10,10,10]
Note:
1 <= K <= A.length <= 500
0 <= A[i] <= 10^6
思路
动态规划。dp[i] 表示前i个数字能组成的最大和。
子问题,遍历最后一个分组的切割点,可能是一个数到k个数字。
代码
class Solution {
public:
int maxSumAfterPartitioning(vector<int>& A, int K) {
int n = A.size();
vector<int> dp(n+1);
dp[0] = 0;
for (int i=1; i<=n; ++i) {
int INF = INT_MIN;
for (int j=1; j<=K && j<=i; ++j) {
INF = max(INF, A[i-j]);
dp[i] = max(dp[i], dp[i-j] + INF*j);
}
}
return dp[n];
}
};