//做了很多的DP的题目,一般都是开始就DP的,这道题DP只是一部分,主要是通过巧妙的方法让数据能够DP起来。
//前天晚上看的这道题目,看了半个小时才把题目看懂(英文的),然后想了一个小时没想出来,接着去百度搜了答案。
//楼主竟然只有程序没有注释,当时没看懂,今天早上用了半个小时把程序的思路过了一遍,懂了。
#include<stdio.h>
#define N 1000002
#define MIN -0x80000000
int max_sum,a[N],sum[N],max_i_1;
int find_max_sum(int m,int n)
{
int i,j,temp;
max_sum=MIN;
for(i=1;i<=m;i++){//循环m次
max_i_1=sum[i-1];//通过temp的记录使得max_i_1是i-1段sum[]中最大的
for(j=i;j<=n;j++){
temp=sum[j];//用于记录i-1段的大小
if(sum[j-1]>max_i_1){//直接加到后面(可能已经是i段了)
sum[j]=sum[j-1]+a[j];
}else{//(这段加上i-1段最大的就是i段的大小)
sum[j]=max_i_1+a[j];
}
if(temp>max_i_1){//通过temp的记录使得max_i_1是i-1段sum[]中最大的
max_i_1=temp;
}
if(i==m && sum[j]>max_sum){//是m段 再找出最大的
max_sum=sum[j];
}
}
}
return max_sum;
}
int main()
{
int n,m,i;
while(scanf("%d%d",&m,&n)!=EOF){
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<=n;i++){
sum[i]=0;
}
printf("%d\n",find_max_sum(m,n));
}
return 0;
}