- 因为数是一段一段取的,所以考虑转化为前缀和
- \(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;
}