B. Easy Partition

  • 因为数是一段一段取的,所以考虑转化为前缀和
  • fi=max(fi1,gi1+ai)
  • 一种是不取当前的前缀和,直接从fi1转移而来
  • 一种是取当前的前缀和,配合gi1提供最好的条件
  • gi=max(gi1,fik+1ai)
#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 @   D06  阅读(2)  评论(0编辑  收藏  举报
//雪花飘落效果
点击右上角即可分享
微信分享提示