01-2. Maximum Subsequence Sum (25)

题目地址:

http://www.patest.cn/contests/mooc-ds2015spring/01-2

此题为最大子列和的加强版。需要记录最大和以及首项和尾项。

最大子列和的算法:

//注意如果最大和小于零则输出零,所以maxsum需初始化为零
for(i=0;i<N;i++){
	//在线加和
	sum+=data[i];
	if(sum>maxsum)
		//更新
		maxsum=sum;
	else if(sum<0)
		//如果sum<0,sum不肯使后面部分和增大,故初始化为零。
		sum=0;
}
只要将上述算法增加一些内容即可
以下为AC代码.

#include<stdio.h>

int main(){


	int a[10000],K;
	int i;
	while(scanf("%d",&K)!=EOF){
		for(i=0;i<K;i++){
			scanf("%d",&a[i]);
		}
		//test 中文
		//mstart是最大值初始值,mend最大值尾值。
		int sum=0,maxsum=0,mstart,mend,start;
		//allneg标记数据是否全部为负数,
		//startchange标记start是否要变化
		bool allneg=true,startchange=true;
		//change标记maxsum是否更新过。
		bool change=false;

		for(i=0;i<K;i++){
			if(a[i]>=0){
				allneg=false;
			}
			if(startchange){
				start=a[i];
				startchange=false;
			}
			sum+=a[i];
			if(sum>maxsum){
				maxsum=sum;
				mstart=start;
				mend=a[i];
				change=true;
			}
			//注意这一步,是防止全部数据除了几个零都是负数的情况!
			else if(change==false && sum==maxsum){
				maxsum=sum;
				mstart=start;
				mend=a[i];
				change=true;
			}

			else if(sum<0){
				//sum<0,start要更新
				startchange=true;
				sum=0;
			}
		}
		if(allneg){
			printf("%d %d %d\n",0,a[0],a[K-1]);
		}
		else{
			printf("%d %d %d\n",maxsum,mstart,mend);
		}
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值