hdu1231 最大连续子序列

注:其实hdu1003和hdu1231这题其实是一样的,这里咱就偷个懒了啊!!大笑


这个是自己写的大家可以看看!!

<span style="font-size:18px;">#include<iostream>
using namespace std;

int a[10001];
int main()
{
	int k;
	while(cin>>k && k)
	{
		int i,Max=-99999999,first=0,last=0,sum=0,x=0;
		bool flag=false;
		for(i=0;i<k;i++)
		{
			scanf("%d",&a[i]);
			if(a[i]>=0)//为了方便处理全为负数的情况
				flag=true;
		}
		if(flag==false)
		{
			//cout<<"0"<<" "<<a[0]<<" "<<a[k-1]<<endl;
			printf("%d %d %d\n",0,a[0],a[k-1]);  
            continue;  
		}
		for(i=0;i<k;i++)
		{
			sum+=a[i];
			if(Max<sum)
			{
				first=a[x];
				last=a[i];
				Max=sum;
			}
			if(sum<0)//如果之前的sum值已经为负数了,我就没必要去的该值了,我只需从后一个数开始就可以了
			{
				sum=0;
				x=i+1;
			}
		}
		printf("%d %d %d\n",Max,first,last);
		//cout<<Max<<" "<<first<<" "<<last<<endl;
	}
	return 0;
}</span>

这个我是看来的觉得他这样做也是很方便和容易理解的!!

<span style="font-size:18px;">最大连续子序列,这应该算一道简单的动态规划题,重要的是找状态转移方程,这题的状态转移方程是:
if(maxsum[i-1]>=0)
maxsum[i]=a[i]+maxsum[i-1];
else
maxsum[i]=a[i];
然后想法记录下标就可以了,我是用结构体记录的,方便,参考程序:
#include<stdio.h>
#include<string.h>
struct MAX
{
int sum,start,end;//记录初始坐标和最大和
}max[10001];//结构体数组
int main()
{
int n,d,i,Max,a[10001];
while(scanf("%d",&n),n){
memset(max,0,sizeof(max));
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
max[1].sum=a[1];//处理第一个
max[1].start=1;//记录初始坐标
max[1].end=1;
for(i=2;i<=n;i++){
if(max[i-1].sum>=0){//状态转移方程
max[i].sum=max[i-1].sum+a[i];
max[i].start=max[i-1].start;//初始坐标不变
max[i].end=i;//末坐标为本身
}
else{
max[i].sum=a[i];
max[i].start=i;//初始坐标改变
max[i].end=i;
}
}
Max=max[1].sum;
d=1;
for(i=2;i<=n;i++){
if(max[i].sum>Max){
Max=max[i].sum;
d=i;
}
}
if(Max<0){//处理全为负数的情况
printf("0 %d %d\n",a[1],a[n]);
continue;
}
printf("%d %d %d\n",Max,a[max[d].start],a[max[d].end]);
}
return 0;
}</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值