无情补卡
/*
N=3830 做法必须控制在N^2以内
1破环成链 2n长度的区间里面所有长度为n的区间共n+1个 前n个长度为n的区间对应从每个位置断开的情况
*/
#include<bits/stdc++.h>
using namespace std;
const int N=4000,INF=0x3f3f3f3f;
int n,m;
int w[N];
int f[2][N][2];//第一维滚动
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>w[i];
//第N小时不在睡觉
memset(f,-0x3f,sizeof f);
f[1][0][0]=f[1][1][1]=0;
for(int i=2;i<=n;i++){
for(int j=0;j<=m;j++){
f[i &1][j][0]=max(f[i-1 &1][j][0],f[i-1 &1][j][1]);
f[i &1][j][1]=-INF;
if(j)f[i &1][j][1]=max(f[i-1 &1][j-1][0],f[i-1 &1][j-1][1]+w[i]);
}
}
int res=f[n &1][m][0];
//第N小时在睡觉
memset(f,-0x3f,sizeof f);
f[1][0][0]=0,f[1][1][1]=w[1];
for(int i=2;i<=n;i++){
for(int j=0;j<=m;j++){
f[i &1][j][0]=max(f[i-1 &1][j][0],f[i-1 &1][j][1]);
f[i &1][j][1]=-INF;
if(j)f[i &1][j][1]=max(f[i-1 &1][j-1][0],f[i-1 &1][j-1][1]+w[i]);
}
}
res=max(res,f[n &1][m][1]);
cout<<res<<endl;
return 0;
}