- 因为数是一段一段取的,所以考虑转化为前缀和
- \(f_i=max(f_{i-1},g_{i-1}+a_i)\)
- 一种是不取当前的前缀和,直接从\(f_{i-1}\)转移而来
- 一种是取当前的前缀和,配合\(g_{i-1}\)提供最好的条件
- \(g_i=max(g_{i-1},f_{i-k+1}-a_i)\)
#include <bits/stdc++.h>
using namespace std;
long long a[1<<20],f[1<<20],g[1<<20];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin>>T;
while(T--)
{
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
a[i]+=a[i-1];
}
if(k==1)
{
cout<<a[n]<<endl;
continue;
}
for(int i=0;i<=n;i++)
{
f[i]=g[i]=-1e18;
}
f[0]=0;
for(int i=1;i<=n;i++)
{
f[i]=max(f[i-1],g[i-1]+a[i]);
if(i>=k-1)
{
g[i]=max(g[i-1],f[i-k+1]-a[i]);
}
}
cout<<f[n]<<"\n";
}
return 0;
}