hdu 1231 最大连续子序列 (dp)

本文介绍了解决HDU 1231问题的方法,该问题要求找出数组中最大子数组的和及其起始与结束位置。通过记录每次迭代过程中的子数组边界,实现了对最大子数组的准确追踪。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1231


解题报告:一晚上加一上午啊!终于搞出来了!

相信最大连续子串和都可以写出来,网上资料一大堆,像N^3,N^2,N算法都有,本题关键是纪录初始位置和终止位置,刚开始想用下标纪录位置,但是总是wa!纠结了一晚上也没有思路,所以换了一种方法,直接 纪录每次的初始位置和终止位置,如果更新sum的话,同时更新初始位置和终止位置,这样子便能使其同步的更新。纪录下标是就是错在这儿


code:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int a[10005];
int sum,pos,flag,ed,st,start,end;

int main()
{
	int m,n;
	while(scanf("%d",&n)&&n)
	{
		for(int i=0;i<n;i++)
			scanf("%d",&a[i]);
		pos=sum=a[0];
		ed=st=start=end=a[0];
		for(int i=1;i<n;i++)
		{	
			if(pos>0)
			{
				pos+=a[i];
				ed=a[i];
			}
			if(pos<=0)
			{
				pos=a[i];
				ed=a[i];
				st=a[i];
			}
			
			if(pos>sum)
			{
				sum=pos;
				start=st;
				end=ed;
			}	
		}
		if(sum>=0)
		printf("%d %d %d\n",sum,start,end);
		else printf("0 %d %d\n",a[0],a[n-1]);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值