转载请声明地址 四元君
5057. 分隔数组以得到最大和
题目难度 Medium
给出整数数组 A,将该数组分隔为长度最多为 K 的几个(连续)子数组。分隔完成后,每个子数组的中的值都会变为该子数组中的最大值。
返回给定数组完成分隔后的最大和。
示例:
输入:A = [1,15,7,9,2,5,10], K = 3
输出:84
解释:A 变为 [15,15,15,9,10,10,10]
提示:
1 <= K <= A.length <= 500
0 <= A[i] <= 10^6
思路
这道题没做出来,说实话根本没看懂是什么意思,为什么答案会输出这么多值???
天了噜,刚发现题目中说的是每个子数组中的值,而不是每个子数组的中值!!星际玩家本人。
那么这道题就显而易见了,动态规划。我们使用res数组,记录当前位置能得到的和的最大值。递归方程式为
res[i+K] = max(res[i+K], res[j+K-1]+(i-j+1)*maxnum);
currMax是目前分层数组中的最大值。从当前值寻找到前面K个。
代码
class Solution {
public:
int maxSumAfterPartitioning(vector<int>& A, int K) {
vector<int> res(A.size()+K, 0);
for (int i = 0; i < A.size(); ++i) {
for (int j = i; j >= 0 && j > i-K; --j) {
int maxnum = 0;
for (int x = i; x >= j && x >= 0; --x) {
maxnum = max(maxnum, A[x]);
}
res[i+K] = max(res[i+K], res[j+K-1]+(i-j+1)*maxnum);
}
}
return res.back();
}
};