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(i−1,j),dp(i−k,j−1)+si−sk)
输出答案的话就再开一个数组 记录路径。
时间复杂度: 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] 689. Maximum Sum of 3 Non-Overlapping Subarrays 三个非重叠子数组的最大和
NC41 最长无重复子数组/NC133链表的奇偶重排/NC116把数字翻译成字符串/NC135 股票交易的最大收益/NC126换钱的最少货币数/NC45实现二叉树先序,中序和后序遍历(递归)(代码片段