//一道usaco月赛题目,,使用记忆化搜索会慢很多,写的不好25000000次准定超时,好点在5000000次,也是超时边缘,这点是一条宝贵的经验
//就题而言可以设定状态f[i][j]表示第i分钟,体力含有j的时候的最远路程,具体的卸载注释中
using namespace std;
const int MAX=10005,INF=1<<30;
int f[MAX][505];
int d[MAX];
int n,m;
int main()
{
#ifndef ONLINE_JUDGE
freopen("i.txt", "r", stdin);
#endif
while(cin>>n>>m){
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++)
cin>>d[i];
for(int i=1;i<=n;i++){
for(int j=0;j<=m;j++){
if(j>=1){
f[i][j]=f[i-1][j-1]+d[i];
//for(int k=1;k<=i&&j+k<=m;k++)
// f[i][j]=max(f[i][j],f[i-k][j+k]);
//去掉上面这两行的原因在于,由于题目的限制,即必须
//休息到体力值为零的时候才可以继续跑,那么上面两行
//会包含在下面体力为零的时候的状态转移中
}
else{
f[i][j]=f[i-1][j];
for(int k=1;k<=i&&j+k<=m;k++)
f[i][j]=max(f[i][j],f[i-k][j+k]);
}
}
}
cout<<f[n][0]<<endl;//根据最终体力必须是零,输出f[][0]即可
}
return 0;
}