寡人又AC了,哦hoho~~
#include<stdio.h>
#define MIN -1000000
int s[1000001],nowwmax[1000001],noww[1000001],preemax[1000001];
main(){
int m,n,i,j,k,r,sum,max;
int *premax,*now,*nowmax,*temp;
premax=preemax;
now=noww;
nowmax=nowwmax;
while(scanf("%d %d",&m,&n)!=EOF){
for(i=1;i<=n;i++) {
scanf("%d",&s[i]);
nowmax[i]=MIN;
}
sum=0;
for(r=1;r<=m;r++){
sum+=s[r];
now[r]=sum;
nowmax[r]=now[r];
for(i=r+1;i<=n;i++){
max=premax[i-1]>now[i-1]?premax[i-1]:now[i-1];
now[i]=max+s[i];
nowmax[i]=now[i]>nowmax[i-1]?now[i]:nowmax[i-1];
}
temp=premax;
premax=nowmax;
nowmax=temp;
}
printf("%d\n",premax[n]);
for(i=1;i<=n;i++) premax[i]=0;
}
}
还有一个想法没实现,mark一下.
记数列为s,其中所有正数数为posi
第一步:将所有正数合并,得到的新数列取代原数列为s
第二步:m>=posi?如果是的话,SUMmax'=-infinity,执行第五步,否则记录下s中最大的m个正项之和为SUMmax',执行第三步
第三步:从所有负数中选出和最大的负数段,将此负数段前一正项,此负数段,此负数段后一正项求和,得到的新数列取代原数列为s
第四步:m>=posi?如果是的话,执行第五步,否则执行第三步
第五步:将所有正数求和,在从所有的负数中选出m-posi个最大的负数求和,两项求和相加得SUMmax,最后结果为max(SUMmax,SUMmax');