hdu 1003-Max Sum

纠结的一道题,题目本身并不怎么难,不过正赶上这两天倒霉,折腾来折腾去的,现在才做出来


题目大意是说给出一列整数,需要求出这列整数最大的并且要求连续的子序列,并要说明该子序列的起点与终点,若有多种答案的话则以第一个为准;


一开始打算用打表,结果超时了,后来百度了下,大概整理下思路:


初始化max为INFsum为0用以临时保存子序列的和;

依次读取数据v

判断sum+=v是不是比max大

如果是的话,将max替换,并标记结束点ed为i(代表当前是第i个数);

如果sum+=v之后变得小于零了,就说明它不应该再继续作为子序列的一部分,因为要求子序列尽量大,既然它已经为负 数,那以后也只会拖累其他的数变小,所以此时将sun重置为0,并且标记s为i的下一位i+1,

(但要注意s并不一定代表最终输出起始点,因为有可能接下来的序列虽然也不为负数,但仍不能超过之前的某一子序 列;所以对起始点bg的赋值也应该放在当sum+=v大于max这一情况成立时,而它的值正应该是刚说到的s。


综上所述,得出状态转移f(i)=max{f(i-1)+v,v},(好吧,其实这个公式我觉得比较纠结,看来看去反而误导人,不过也有可能是我个人问题,随便啦~~


最后备份代码:

#include<cstdio>
int main()
{
	int n(0),num,ne,g,bg,ed,s;
	scanf("%d",&num);
	while(++n<=num)
	{
		scanf("%d",&ne);
		int sum=0,max=-99999999;
		bg=ed=s=1;
		for(int i=1;i<=ne;++i)
		{
			scanf("%d",&g);
			sum+=g;
			if(sum>max)
			{
				max=sum;
				bg=s;
				ed=i;
			}
			if(sum<0)
			{
				sum=0;
				s=i+1;
			}
		}
		printf("Case %d:\n",n);
		printf("%d %d %d\n",max,bg,ed);
		if(n!=num) printf("\n");
	}
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值