/*
题意:给一段区间,要求两段不交叉区间总和最大,求符合条件left_a 和 left_b的最小值
分析:dp 压缩区间值,对sum的值进行维护
*/
#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
#include<cstdio>
using namespace std;
#define manx 200009
long long dp[manx],maxx,sum;
int a[manx];
int main(){
int n,k,pos_a,pos_b,bb;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=k;i++) dp[1]+=a[i];
for(int i=k+1;i<=n;i++) dp[i-k+1]=dp[i-k]-a[i-k]+a[i]; // 压缩
for(int i=n-2*k+1;i>=1;i--){
if(maxx<=dp[i+k]) maxx=dp[i+k], bb=i+k; //
if(sum<=maxx+dp[i]) sum=maxx+dp[i], pos_a=i, pos_b=bb; // 要求两段不交叉区间和最大
}
printf("%d %d\n",pos_a,pos_b);
} #193div2B 两端不交叉区间和最大
最新推荐文章于 2023-12-21 18:00:25 发布
本文介绍了一个区间和最大化问题的解决方案,通过动态规划压缩技巧来找到两个不相交子区间,使其元素之和最大,并确定这两个区间的起始位置。代码实现了输入处理、区间值维护及最终结果输出。
5358

被折叠的 条评论
为什么被折叠?



