题目大意
个数排成一个环,请选出不超过
段的连续的数,段与段间不能重叠,且
使得选出的数和最大
题目解析
设
表示第
个数第
段选或不选
但是这是个环,所以再求个最小值看看哪个优即可
代码
#include<bits/stdc++.h>
using namespace std;
int n,k,sum,maxn=-1e9,minn=1e9;
int a[100005],f[100005][12][2];
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>a[i],sum+=a[i];
memset(f,-0x3f,sizeof(f));
f[1][1][1]=a[1];
f[1][0][0]=0;
for(int i=2;i<=n;i++)
for(int j=0;j<=k;j++)
{
f[i][j][1]=max(f[i-1][j][1],f[i-1][j-1][0])+a[i];
f[i][j][0]=max(f[i-1][j][1],f[i-1][j][0]);
maxn=max(maxn,max(f[i][j][1],f[i][j][0]));
}
memset(f,0x3f,sizeof(f));
f[1][1][1]=a[1];
f[1][0][0]=0;
for(int i=2;i<=n;i++)
for(int j=0;j<=k;j++)
{
f[i][j][1]=min(f[i-1][j][1],f[i-1][j-1][0])+a[i];
f[i][j][0]=min(f[i-1][j][1],f[i-1][j][0]);
minn=min(minn,min(f[i][j][1],f[i][j][0]));
}
cout<<max(maxn,sum-minn);
}