HDU 1003 Max Sum

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

以前做过类似的题目,但不需要保存下标。因为这题是动态规划的基础,所以从网上直接粘下来稍稍改动就保存下来了。步骤的含义都包含在代码中。。。

代码:

#include<stdio.h>
int main()
{
	int s,n,i,j,num,begin,end,probable,sum,max,count=1;//**begin,end分别保存最大子串的首尾。sum保存连续字串(最大连续串[可能]在其中)。**//
	//**max保存最大连续和,probalbe保存可能的最大连续和的首地址**//
	scanf("%d",&s);
	for(j=1;j<=s;j++)
	{
		sum=0;
		probable=1;//**不是first=1,现在只是可能,到下面发现比目前大的连续子串时才用first记录**//
		max=-100000;
		scanf("%d",&n);
		for(i=1;i<=n;i++)
		{
			scanf("%d",&num);
			sum=sum+num;
			if(sum>max)//**发现比目前大的连续子串**//
			{
				max=sum;
				begin=probable;
				end=i;
			}
			if(sum<0)//**根据原理,后面可能有比他还大的**//
			{
				sum=0;//**重新记录**//
				probable=i+1;//**可能更大的串一定从下一个开始**//
			}
		}
		printf("Case %d:\n",count++);
		printf("%d %d %d\n",max,begin,end);
		if(j<=s-1)//**格式**//
		{
			printf("\n");
		}
	}
	return 0;
}



你可能感兴趣的:(HDU 1003 Max Sum)