B. Easy Partition

  • 因为数是一段一段取的,所以考虑转化为前缀和
  • \(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;
}
posted @ 2025-01-31 16:53  D06  阅读(14)  评论(0)    收藏  举报
//雪花飘落效果