hdoj1024

寡人又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');
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值