689. 三个无重叠子数组的最大和(dp)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了689. 三个无重叠子数组的最大和(dp)相关的知识,希望对你有一定的参考价值。

689. 三个无重叠子数组的最大和 (dp)

考虑dp,令 d p ( i , j ) dp(i,j) dp(i,j)表示前 i i i个元素选择 j j j个互不重叠长为 k k k的最大和。

显然有 d p dp dp转移方程: d p ( i , j ) = m a x ( d p ( i − 1 , j ) , d p ( i − k , j − 1 ) + s i − s k ) dp(i,j)=max(dp(i-1,j),dp(i-k,j-1)+s_i-s_k) dp(i,j)=max(dp(i1,j),dp(ik,j1)+sisk)

输出答案的话就再开一个数组 记录路径。

时间复杂度: O ( 3 n ) O(3n) O(3n)

class Solution 
public:
    vector<int> maxSumOfThreeSubarrays(vector<int>& a, int k) 
        int n=(int)a.size();
        vector<int>sum(n+1);
        int sz = 3;
        vector<vector<int> >dp(n+1,vector<int>(sz+1));
        vector<vector<int> >path(n+1,vector<int>(sz+1));
        for(int i=1;i<=n;i++) sum[i] = sum[i-1] + a[i-1];
            for(int i=k;i<=n;i++)
                for(int j=1;j<=sz;j++)
                dp[i][j] = dp[i-1][j];
                path[i][j] = path[i-1][j];
                if(dp[i][j] < dp[i-k][j-1] + sum[i] - sum[i-k])
                    dp[i][j] = dp[i-k][j-1] + sum[i] - sum[i-k];
                    path[i][j] = i;
                
            
        vector<int>res;
        int id = path[n][sz];
        res.push_back(id-k);
        for(int i=sz-1;i;i--)
            id = path[id-k][i];
            res.push_back(id-k);
        
        reverse(res.begin(),res.end());
        return res;
       
;

以上是关于689. 三个无重叠子数组的最大和(dp)的主要内容,如果未能解决你的问题,请参考以下文章

《LeetCode之每日一题》:229.三个无重叠子数组的最大和

数据结构与算法之深入解析“三个无重叠子数组的最大和”的求解思路与算法示例

2021-07-16:三个无重叠子数组的最大和。给定数组 nums 由正整数组成,找到三个互不重叠的子数组的最大和。每个子数组的长度为k,我们要使这3*k个项的和最大化。返回每个区间起始索引的列表(索

LeetCode_Dec_1st_Week

[LeetCode] 689. Maximum Sum of 3 Non-Overlapping Subarrays 三个非重叠子数组的最大和

NC41 最长无重复子数组/NC133链表的奇偶重排/NC116把数字翻译成字符串/NC135 股票交易的最大收益/NC126换钱的最少货币数/NC45实现二叉树先序,中序和后序遍历(递归)(代码片段