LeetCode-1043. 分隔数组以得到最大和

题目描述 [分隔数组以得到最大和]

给出整数数组 A,将该数组分隔为长度最多为 K 的几个(连续)子数组。分隔完成后,每个子数组的中的值都会变为该子数组中的最大值。

返回给定数组完成分隔后的最大和。

示例

输入:A = [1,15,7,9,2,5,10], K = 3
输出:84
解释:A 变为 [15,15,15,9,10,10,10]

解题思路

动态规划

  • 定义dp[i]为子数组A[0,j]按照题意分割后的最大和
  • 定义最后一个分割区间长度j, 则显然 j∈[1,K]
  • 定义最后一个分割区间最大值 num_max, 则有num_max=max{num_max, A[i−j+1,i]}
  • 对于每种取值,均可更新最优解,因此转移公式为:
    dp[i] = max(dp[i], dp[i-j] + j * num_max) i - j >= 0
    dp[i] = max(dp[i], j * num_max) , else

代码

class Solution {
public:
    int maxSumAfterPartitioning(vector<int>& A, int K) {
        vector<int> dp(A.size());
        for(int i=0;i<A.size();i++){
            int max_num = A[i];
            for(int j=1;j<=K&&i-j+1>=0;j++){
                max_num = max(max_num, A[i-j+1]);
                if(i-j>=0) dp[i] = max(dp[i], dp[i-j]+j*max_num);
                else dp[i] = max(dp[i], j*max_num);
            }
        }
        return dp[A.size()-1];
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。