2023-04-19每日一题
一、题目编号
1043. 分隔数组以得到最大和
二、题目链接
https://leetcode.cn/problems/partition-array-for-maximum-sum/
三、题目描述
给你一个整数数组 arr,请你将该数组分隔为长度 最多 为 k 的一些(连续)子数组。分隔完成后,每个子数组的中的所有值都会变为该子数组中的最大值。
返回将数组分隔变换后能够得到的元素最大和。本题所用到的测试用例会确保答案是一个 32 位整数。
四、解题代码
class Solution {
public:
int maxSumAfterPartitioning(vector<int>& arr, int k) {
int dp[510];
int n = arr.size();
memset(dp, 0, sizeof(dp));
for(int i = 0; i < n; ++i){
int maxv = 0;
int cnt = 0;
for(int j = i; j >= 0; --j){
if(maxv < arr[j]){
maxv = arr[j];
}
++cnt;
if(cnt > k){
break;
}
if(j){
dp[i] = max(dp[i], dp[j-1] + maxv * cnt);
}
else{
dp[i] = max(dp[i], maxv * cnt);
}
}
}
return dp[n-1];
}
};
五、解题思路
(1)采用动态规划的思路来解决。
(2)设计一维数组dp,dp[j] 意思为以i为下标的数为末端加上之前的数字所能分割形成的最大值。
(3)首先先判断以下标i为末端向前数k个数字的最大值。用一个数字j来从i开始遍历,一直到位0为止,如果计数器的长度显示大于k则跳出循环。如果j不为0,则表示没到边界,此时最大值为当前最大值dp[i]和dp[j-1] + 范围内的最大值乘以计数器的值。如果为0则为边界,此时最大值即为当前最大值dp[i]和范围内的最大值乘以计数器的值的最大值。
(4)最后返回dp[n-1]即为最终值。