大多数人用的前缀和+dp
由于是两个区间,我们可以把这个区间分开。
第一个区间一直找最大值,然后紧接着第一个区间的下一个找最大值
然后计算两个 相加的最大值。
相当于遍历了所有长度为k的区间。只是固定了第一组在第二组前边(因为是连续的)。
#include<iostream>
#include<climits>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
int t,n,k;
ll a[maxn];
int main(){
int t;
cin>>t;
while(t--){
cin>>n>>k;
a[0]=0;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i]+=a[i-1]; //计算前缀和
}
ll ans=INT_MIN,before=INT_MIN;
for(int i=k;i+k<=n;i++){
before=max(before,a[i]-a[i-k]); //计算第一组的最大值
ans=max(ans,before+a[i+k]-a[i]);//第二组的最大值在第一组后边,当第一组找到最大后,依次找第二组的最大值
}cout<<ans<<endl;
}
return 0;
}


京公网安备 11010502036488号