在这题我们要选择两个区间 首先我们知道 右区间一定在左区间右边
于是 我们枚举i作为分界线 i左边最大的长度为k的的区间 i右边最大的长度为k的的区间
解题的思路出来了 那么该如何用程序表达
用cnt数组表示前缀和
那么i左边的最大区间和表达为 dp1[i]=max(dp1[i-1],cnt[i]-cnt[i-k]);
那么i右边的最大区间和表达为 dp2[i]=max(dp2[i+1],cnt[i+k-1]-cnt[i-1]);
答案就为 ans=max(ans,dp1[i]+dp2[i+1]);
PS:记得将dp1 dp2 ans 都初始化为负无穷大

#include <bits/stdc++.h>
#define ll long long
ll const N=2e5+5;
ll const INF=1e18;
using namespace std;
ll t,n,k,a[N],cnt[N],dp1[N],dp2[N];
int main()
{
    scanf("%lld",&t);
    while(t--)
    {
        memset(dp1,-0x7f,sizeof(dp1));
        memset(dp2,-0x7f,sizeof(dp2));
        scanf("%lld %lld",&n,&k);
        cnt[0]=0;
        for(int i=1;i<=n;++i){scanf("%lld",&a[i]);cnt[i]=cnt[i-1]+a[i];}
        for(int i=k;i<=n-k;++i)   dp1[i]=max(dp1[i-1],cnt[i]-cnt[i-k]);
        for(int i=n-k+1;i>=k+1;--i)dp2[i]=max(dp2[i+1],cnt[i+k-1]-cnt[i-1]);
        ll ans=-INF;
        for(int i=k;i<=n-k;++i) ans=max(ans,dp1[i]+dp2[i+1]);
        cout<<ans<<endl;
    }
    return 0;
}