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

题目描述

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

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

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

题目解析

  1. 题目描述为需要将数据进行分割,每段长度为1~K。
  2. 典型的动态规划问题,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()];
    }
};
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容