大多数人用的前缀和+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; }