题目描述
给出整数数组 A,将该数组分隔为长度最多为 K 的几个(连续)子数组。分隔完成后,每个子数组的中的值都会变为该子数组中的最大值。
返回给定数组完成分隔后的最大和。
示例:
输入:A = [1,15,7,9,2,5,10], K = 3
输出:84
解释:A 变为 [15,15,15,9,10,10,10]
题目解析
- 题目描述为需要将数据进行分割,每段长度为1~K。
- 典型的动态规划问题,dp[i] 表示该i为分割后的该段的最后一个数,则该分割为上一个分割的结果加上该分割的最大值乘该分割数据个数,得出状态转移方程dp[i] = max(dp[i], dp[i-j] + j*max), 其中j的范围为1~K。
C++代码
class Solution {
public:
int maxSumAfterPartitioning(vector<int>& A, int K) {
vector<int> dp(A.size() + 1, 0);
for(int i = 1; i <= A.size(); i++) {
int maxTemp = A[i - 1];
for(int j = 1; j <= K; j++) {
if(i >= j) {
maxTemp = max(maxTemp, A[i-j]);
dp[i] = max(dp[i], dp[i - j] + j*maxTemp);
}
}
}
return dp[A.size()];
}
};